#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
int counter=0;/*两个线程都能修改的共享变量 */
void thread1(void *arg);
void thread2(void *arg);
int main(int argc, char *argv[])
{
pthread_t id1,id2;
/*创建第1个线程*/
pthread_create(&id1,NULL,(void *)thread1, NULL);
/*创建第2个线程*/
pthread_create(&id2,NULL,(void *)thread2, NULL);
pthread_join(id1,NULL); /*等待第1个线程结束*/
pthread_join(id2,NULL); /*等待第2个线程结束*/
/*打印counter最后的值*/
printf("最后的counter值为%d\n",counter);
exit(0);
}
void thread1(void *arg)/*第1个线程执行代码*/
{
int i,val;
for(i=1;i<=5;i++)
{
val=++counter;
printf("第1个线程:第%d次循环,第1次引用counter=%d\n",i,counter);/*LINE A*/
sleep(3);/*睡眠或挂起3秒钟*/
printf("第1个线程:第%d次循环,第2次引用counter=%d\n",i,counter);/*LINE B*/
counter=val;
}
}
void thread2(void *arg)/*第2个线程执行代码*/
{
int i,val;
for(i=1;i<=5;i++)
{
val=++counter;
sleep(1);/*睡眠或挂起1秒钟*/
printf("第2个线程:第%d次循环,counter=%d\n",i,counter);
counter=val;
}
}
输出结果为5,两个线程一直在争用数据,互相串改数据,为什么这么说呢
做了以下的实验,改变了线程的睡眠时间
2个sleep都为2 结果不变
第一个为3 第二个为2 结果不变
第一个为2 第二个为3 结果变为6
程序加上互斥锁
void thread1(void *arg)/*第1个线程执行代码*/
{
int i,val;
for(i=1;i<=5;i++)
{
pthread_mutex_lock(&sMux);
val=++counter;
printf("第1个线程:第%d次循环,第1次引用counter=%d\n",i,counter);/*LINE A*/
sleep(2);/*睡眠或挂起3秒钟*/
printf("第1个线程:第%d次循环,第2次引用counter=%d\n",i,counter);/*LINE B*/
counter=val;
pthread_mutex_unlock(&sMux);
}
}
输出结果变为10,并且先执行完线程一,再执行线程二