马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一、多线程对共享变量的非互斥访问
我们将要做的:构造多线程共享变量竞争的案例,并分析现象发生的原因,进而思考解决方式。
案例源代码:
- #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;
- }
复制代码 |