#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/sysinfo.h>
#include <sched.h>
#include <ctype.h>
#include <fcntl.h>
pthread_mutex_t mutex;
int val = 0;
void *ThreadFunc(void *arg)
{
while(1)
{
pthread_mutex_lock(&mutex); /*获取互斥锁*/
int i = 0;
for(i = 0 ; i < 10000 ; i++)
{
val++;
}
printf("val = %d\n" , val);
pthread_mutex_unlock(&mutex); /*释放互斥锁*/
usleep(20);
}
return 0;
}
int main()
{
void *ResVal;
pthread_mutex_init (&mutex, NULL); /*定义*/
pthread_t thread1 , thread2;
pthread_create(&thread1 , NULL , ThreadFunc , NULL);
pthread_create(&thread2 , NULL , ThreadFunc , NULL);
pthread_join(thread1 , &ResVal);
pthread_join(thread2 , &ResVal);
}
互斥锁实际上就是为了防止一个线程在使用某一其他线程也能访问到的变量时,其他线程也去使用这个变量,导致变量值不可预测。
以上测试程序若注释掉有注释的三句话,也就是不使用互斥锁,则实验效果为
val在某一时刻正在自加的过程中被另一个线程打断,导致for循环没有执行完,值不可控
若使用互斥锁,则val永远是以10000位单位自加