互斥量mutex使用
两个线程累加一个公共资源各100000次,结果应为200000,在没有加互斥锁的情况下出现随机数。
对于多线程的程序,访问冲突的问题是很普遍的,解决的办法是引⼊入互斥锁(Mutex,MutualExclusive Lock),获得锁的线程可以完成“读-修改-写”的操作,然后释放锁给其它线程,没有获得锁的线程只能等待⽽而不能访问共享数据,这样“读-修改-写”三步操作组成⼀一个原⼦子操作,要么都执⾏行,要么都不执⾏行,不会执⾏行到中间被打断,也不会在其它处理器上并⾏行做这个操作。
为了实现互斥锁操作,⼤大多数体系结构都提供了swap或exchange指令,该指令的作⽤用是把寄存器和内存单元的数据相交换,由于只有⼀一条指令,保证了原⼦子性,即使是多处理器平台,访问内存的 总线周期也有先后,⼀一个处理器上的交换指令执⾏行时另⼀一个处理器的交换指令只能等待总线周期。
unlock中的释放锁操作同样只⽤用⼀一条指令实现,以保证它的原⼦子性。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
static int g_count = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *r_w_mem(void *_val)
{
int val = 0;
int i =0;
for (i = 0; i < 100000; i++)
{
pthread_mutex_lock(&mutex);
val = g_count;
g_count = val + 1;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main()
{
pthread_t tid1;
pthread_t tid2;
pthread_create(&tid1, NULL, r_w_mem, NULL);
pthread_create(&tid2, NULL, r_w_mem, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
printf("count val is : %d\n", g_count);
return 0;
}