Pthread - 互斥量(Mutex) 和 条件变量(Condition variable)
Mutex
Mutex 全称 “mutual exclusion”,是一种实现线程同步的方法。
在访问共享资源时,Mutex 的作用如同一把“锁”。给定时间只有一个线程可以对 Mutex 加锁,其他线程必须等待当前线程解锁才能重新获取 Mutex。如此线程便可以依次访问共享资源。
通常Mutex 使用场景是多个线程访问全局变量(又被称作“critical section”),Mutex可以确保变量的最终值和单线程下操作结果保持一致。
Pthread 中 Mutex 的操作函数有:
pthread_mutexattr_init (attr)
thread_mutex_init (mutex,attr)
pthread_mutex_lock (mutex)
pthread_mutex_trylock (mutex)
pthread_mutex_unlock (mutex)
pthread_mutex_destroy (mutex)
pthread_mutexattr_destroy (attr)
其中pthread_mutexattr_init和pthread_mutexattr_destroy初始化和销毁 Mutex属性变量(pthread_mutexattr_t);pthread_mutex_init和pthread_mutex_destroy初始化和销毁互斥量(pthread_mutex_t); pthread_mutex_lock和 pthread_mutex_trylock尝试对 Mutex 加锁,不同之处在于前者在Mutex 已被其它线程获取会阻塞,而后者会立即返回一个“EBUSY”的错误码。pthread_mutex_unlock对 Mutex 解锁。
下面提供一个示例,程序实现两向量的点积:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double *a;
double *b;
double sum;
int veclen;
}DOTDATA;
#define NUMTHRDS 4
#define VECLEN 100
DOTDATA dotstr;
pthread_t callThd[NUMTHRDS];
pthread_mutex_t mutexsum;
void *dotprod(void *arg)
{
long offset = (long)arg;
int len = dotstr.veclen;
int start = offset*len;
int end = start + len;
double* x = dotstr.a;
double* y = dotstr.b;
printf("Thread %ld started...\n", offset);
double mysum;
mysum = 0;
int i;
for(i=start; i<end; ++i) {
mysum += (x[i]*y[i]);
}
pthread_mutex_lock(&mutexsum);
dotstr.sum += mysum;
pthread_mutex_unlock(&mutexsum);
pthread_exit((void*)0);
}
int main(int argc, char* argv[])
{
double *a = (double*)malloc(NUMTHRDS*VECLEN*sizeof(double));
double *b = (double*)malloc(NUMTHRDS*VECLEN*sizeof(double));