【操纵系统(Linux)】——多线程对共享变量访问的同步与互斥 ...

张裕  论坛元老 | 2025-4-10 11:03:40 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1387|帖子 1387|积分 4161

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、多线程对共享变量的非互斥访问

我们将要做的:构造多线程共享变量竞争的案例,并分析现象发生的原因,进而思考解决方式。
案例源代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. int num=30,count=10;
  7. void *sub1(void *arg) {
  8.         int i = 0,tmp;
  9.         for (; i <count; i++){
  10.             tmp=num-1;
  11.                  usleep(13);
  12.         num=tmp;
  13.         printf("线程1 num减1后值为: %d\n",num);
  14.     }
  15.     return ((void *)0);
  16. }
  17. void *sub2(void *arg){
  18.         int i=0,tmp;
  19.     for(;i<count;i++){
  20.             tmp=num-1;
  21.                  usleep(31);
  22.                  num=tmp;
  23.         printf("线程2 num减1后值为: %d\n",num);
  24.     }
  25.     return ((void *)0);
  26. }
  27. int main(int argc, char** argv) {
  28.         pthread_t tid1,tid2; // 两个子线程的id
  29.     int err,i=0,tmp;
  30.     void *tret; // 线程返回值
  31.     err=pthread_create(&tid1,NULL,sub1,NULL);
  32.     if(err!=0){
  33.             printf("pthread_create error:%s\n",strerror(err));
  34.         exit(-1);
  35.     }
  36.         err=pthread_create(&tid2,NULL,sub2,NULL);
  37.     if(err!=0){
  38.             printf("pthread_create error:%s\n",strerror(err));
  39.         exit(-1);
  40.     }
  41.     for(;i<count;i++){
  42.             tmp=num-1;
  43.                  usleep(5);
  44.         num=tmp;
  45.         printf("main num减1后值为: %d\n",num);
  46.     }
  47.     printf("两个线程运行结束\n");
  48.     err=pthread_join(tid1,&tret);
  49.     if(err!=0){
  50.             printf("can not join with thread1:%s\n",strerror(err));
  51.         exit(-1);
  52.     }
  53.     printf("thread 1 exit code %d\n",(int)tret);
  54.     err=pthread_join(tid2,&tret);
  55.     if(err!=0){
  56.                 printf("can not join with thread1:%s\n",strerror(err));
  57.         exit(-1);
  58.     }
  59.     printf("thread 2 exit code %d\n",(int)tret);
  60.         return 0;
  61. }
复制代码
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表