在计算机中,通常是多线程同时执行,线程均可访问进程的资源,因此当这些线程并发访问临界资源时,如果不进行线程同步,将会导致错误发生,程序运行结果出现不可预知的错误,但往往这些错误无法重现,并且程序正确运行。linux提供了互斥量来控制线程对临界资源的访问,即通过对互斥量进行加锁解锁。
下面程序实现四个数相加。首先在主线程中创建了两个线程分别执行run1,和run2。这两个线程在执行的过程中都会访问临界资源a,b,以及calculate_sum方法,两个线程同时执行。假设,当同时访问a时,线程1将2赋值给了a,线程2在其后又将4赋给了a,那么a的值便改变了,而线程1运行的结果便改变了。
因此,在我们不知道线程运行顺序的时候,通过定义信号量,对要访问的临界资源进行加锁解锁操作。在线程中对a,b,以及calculate_sum方法进行加锁,在访问完后再对其进行解锁操作,便可实现线程同步。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<pthread.h>
#include<unistd.h>
typedef unsigned int u32;
pthread_t ntid1;
pthread_t ntid2;
void calculate_sum(int a,int b,const char*);
void *run1(void *);
void *run2(void *);
int main(){
int err1,err2;
err1 = pthread_create(&ntid1,NULL,run1,NULL);
err2 = pthread_create(&ntid2,NULL,run2,NULL);
sleep(2);
return 0;
}
int sum = 0;
int a = 0;
int b = 0;
pthread_mutex_t mqlock = PTHREAD_MUTEX_INITIALIZER;
void calculate_sum(int a,int b,const char *s){
sum =sum + a + b;
printf("%s: sum = %d\n",s,sum);
}
void *run1(void *arg){
pthread_mutex_lock(&mqlock);
a = 2;
b = 5;
sleep(1);
calculate_sum(a,b,"run1");
pthread_mutex_unlock(&mqlock);
}
void *run2(void *arg){
pthread_mutex_lock(&mqlock);
a = 4;
b = 4;
calculate_sum(a,b,"run2");
pthread_mutex_unlock(&mqlock);
}