IT评测·应用市场-qidao123.com技术社区
标题:
【操纵系统(Linux)】——多线程对共享变量访问的同步与互斥
[打印本页]
作者:
张裕
时间:
2025-4-10 11:03
标题:
【操纵系统(Linux)】——多线程对共享变量访问的同步与互斥
一、多线程对共享变量的非互斥访问
我们将要做的:
构造
多线程共享变量竞争
的案例,并分析现象发生的原因,进而思考解决方式。
案例源代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
int num=30,count=10;
void *sub1(void *arg) {
int i = 0,tmp;
for (; i <count; i++){
tmp=num-1;
usleep(13);
num=tmp;
printf("线程1 num减1后值为: %d\n",num);
}
return ((void *)0);
}
void *sub2(void *arg){
int i=0,tmp;
for(;i<count;i++){
tmp=num-1;
usleep(31);
num=tmp;
printf("线程2 num减1后值为: %d\n",num);
}
return ((void *)0);
}
int main(int argc, char** argv) {
pthread_t tid1,tid2; // 两个子线程的id
int err,i=0,tmp;
void *tret; // 线程返回值
err=pthread_create(&tid1,NULL,sub1,NULL);
if(err!=0){
printf("pthread_create error:%s\n",strerror(err));
exit(-1);
}
err=pthread_create(&tid2,NULL,sub2,NULL);
if(err!=0){
printf("pthread_create error:%s\n",strerror(err));
exit(-1);
}
for(;i<count;i++){
tmp=num-1;
usleep(5);
num=tmp;
printf("main num减1后值为: %d\n",num);
}
printf("两个线程运行结束\n");
err=pthread_join(tid1,&tret);
if(err!=0){
printf("can not join with thread1:%s\n",strerror(err));
exit(-1);
}
printf("thread 1 exit code %d\n",(int)tret);
err=pthread_join(tid2,&tret);
if(err!=0){
printf("can not join with thread1:%s\n",strerror(err));
exit(-1);
}
printf("thread 2 exit code %d\n",(int)tret);
return 0;
}
复制代码
欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/)
Powered by Discuz! X3.4