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

问题描述 投票:1回答:1

假设我们有一个基于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);

c multithreading tcp client-server mutex
1个回答
0
投票

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

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

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

例如,

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);
   }
© www.soinside.com 2019 - 2024. All rights reserved.