假设我们有一个基于TCP / IP通信和多线程的客户端服务器应用程序。
假设服务器端我们有这三个全局变量:
char matrix[ROW][COLUMNS];
int isEmpty = 0;
float anotherDummyVariable;
如果我声明全局pthread互斥量,如下所示
pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER;
我可以将此互斥锁用于以下三个变量中的任何一个lock
和unlock
:
...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);
?
使用一个互斥锁将起作用。但是,这并不是最佳选择,因为每次变量被锁定时,所有其他变量也会被锁定。
取决于程序,这可能是必要的(如果变量之间存在某些依赖关系,则一个不能没有另一个就不能更改)。但是,如果不是这样,则每个数据块/变量最好有一个互斥锁。
因此,取决于对性能的影响以及算法,您可能更喜欢使用多个互斥锁。
例如,
int data[N];
int count = 0; // number of items in data
我们有data
和count
相互依赖。
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);
}