IT评测·应用市场-qidao123.com技术社区

标题: 【操纵系统(Linux)】——多线程对共享变量访问的同步与互斥 [打印本页]

作者: 张裕    时间: 2025-4-10 11:03
标题: 【操纵系统(Linux)】——多线程对共享变量访问的同步与互斥
一、多线程对共享变量的非互斥访问

我们将要做的:构造多线程共享变量竞争的案例,并分析现象发生的原因,进而思考解决方式。
案例源代码:
  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. }
复制代码





欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4