我可以使用单个pthread互斥锁来锁定/解锁许多全局变量吗?

假设我们有一个基于TCP / IP通信和多线程的客户端服务器应用程序。

让我们假设服务器端具有以下三个全局变量:

char matrix[ROW][COLUMNS];
int isEmpty = 0;
float anotherDummyVariable;

如果我按如下方式声明全局pthread互斥体

pthread_mutex_t myMutex = pthREAD_MUTEX_INITIALIZER;

我可以将此互斥锁用于这三个变量的lockunlock,如下所示:

...somewhere in the code...
pthread_mutex_lock(&myMutex);
isEmpty = 1;
pthread_mutex_unlock(&myMutex);

和其他地方...

pthread_mutex_lock(&myMutex);
matrix[ROW][COLUMNS]={0};
pthread_mutex_unlock(&myMutex);

我应该声明三个互斥量,每个要管理的全局变量一个,如下所示:

pthread_mutex_t matrixMutex = pthREAD_MUTEX_INITIALIZER;
pthread_mutex_t isEmptyMutex = pthREAD_MUTEX_INITIALIZER;
pthread_mutex_t anotherDummyVariableMutex = pthREAD_MUTEX_INITIALIZER;

然后在代码中的某处...

pthread_mutex_lock(&isEmptyMutex);
isEmpty = 1;
pthread_mutex_unlock(&isEmptyMutex);

和其他地方...

pthread_mutex_lock(&matrixMutex);
matrix[ROW][COLUMNS]={0};
pthread_mutex_unlock(&matrixMutex);

suleo123 回答:我可以使用单个pthread互斥锁来锁定/解锁许多全局变量吗?

使用一个互斥锁即可。但是,这并不是最佳选择,因为每次变量被锁定时,所有其他变量也会被锁定。

取决于程序,这可能是必要的(如果变量之间存在某些依赖关系,则一个不能没有另一个就不能更改)。但是,如果不是这样,则每个数据/变量块最好有一个互斥锁。

因此,取决于对性能的影响以及算法,您可能更喜欢使用多个互斥锁。

以一个例子

int data[N]; 
int count = 0;              // number of items in data

我们有datacount相互依赖。

void set(int arr,int size) { // add size items from arr to data
   ... 
   for(i=0 ; i<size ; i++) data[count++] = arr[i];
   ...
}

在这种情况下,最好使用一个互斥锁(形成关键部分)锁定整个功能,以保护数据和计数

   void set(int arr,int size) { // add size items from arr to data
       pthread_mutex_lock(dataaccess);
       ... 
       for(i=0 ; i<size ; i++) data[count++] = arr[i];
       ...
       pthread_mutex_unlock(dataaccess);
   }

在其他地方具有检查count并读取data[i]的功能

   int read(int i) {
       pthread_mutex_lock(dataaccess);
       ... 
       if (i >= count) { ...throw error }
       int res = data[i];
       ...
       pthread_mutex_unlock(dataaccess);
       return res;
   }
本文链接:https://www.f2er.com/2341756.html

大家都在问