免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4910 | 回复: 9
打印 上一主题 下一主题

[Linux] 问一个linux多线程里面锁的问题 [复制链接]

论坛徽章:
2
申猴
日期:2014-04-17 14:37:17CU十四周年纪念徽章
日期:2018-06-23 16:03:03
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-02 10:56 |只看该作者 |倒序浏览
之前在c/c++版提问过没人回答,在这个版提问,不知道有人解答吗?
  1. #include<pthread.h>
  2. #include<unistd.h>
  3. #include<stdio.h>
  4. #include<string.h>
  5. #include<stdlib.h>
  6. #include<time.h>
  7. static pthread_mutex_t mtx=PTHREAD_MUTEX_INITIALIZER;
  8. static pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

  9. int global_val = 0;

  10. void* test(void *argv) {
  11.     printf("test before lock\n");
  12.     pthread_mutex_lock(&mtx);
  13.     while(global_val == 0) {
  14.         pthread_cond_wait(&cond,&mtx);
  15.     }
  16.     pthread_mutex_unlock(&mtx);
  17.     printf("@@@@@%d\n",global_val);
  18. }
  19. void* add(void *argv) {
  20.     sleep(1);
  21.     printf("add before lock\n");
  22.     pthread_mutex_lock(&mtx);
  23.     global_val++;
  24.     printf("###%d\n",global_val);
  25.     pthread_mutex_unlock(&mtx);
  26.    
  27. }
  28. int main() {
  29.     pthread_t tid1,tid2;
  30.     global_val = 0;
  31.     pthread_create(&tid1,NULL,test,NULL);
  32.     sleep(1);
  33.     pthread_create(&tid2,NULL,add,NULL);
  34.     printf("main begin\n");
  35.     pthread_mutex_lock(&mtx);
  36.     global_val = 5;
  37.     sleep(3);
  38.     pthread_cond_signal(&cond);
  39.     printf("signal over before unlock\n");
  40.     sleep(3);
  41.     pthread_mutex_unlock(&mtx);
  42.     pthread_join(tid1,NULL);
  43.     pthread_join(tid2,NULL);
  44. }
复制代码
我要模拟的情况是有一个test线程阻塞在pthread_cond_wait(&cond,&mtx);,另外一个add线程阻塞在pthread_mutex_lock(&mtx);
然后主线程调用pthread_cond_signal(&cond);和pthread_mutex_unlock(&mtx); 这个时候会是哪个线程抢到锁?
pthread_cond_wait的线程会高优先级抢到锁吗,还是说随机的?
我上面测试代码是add线程抢到了锁。
我的测试代码输出:
test before lock
main begin
add before lock
signal over before unlock
###6
@@@@@6

论坛徽章:
4
双子座
日期:2014-08-28 10:08:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:112015年亚洲杯之阿联酋
日期:2015-03-13 03:25:15
2 [报告]
发表于 2014-06-02 16:12 |只看该作者
这类问题,要嘛去内核那边问问,要嘛自己看看源码。

论坛徽章:
0
3 [报告]
发表于 2014-06-02 17:10 |只看该作者
个人觉得应该是void* test(void *argv)先抢到锁,但刚才试了下,输出结果和你的相同

后来发现造成这种结果和最后一个 sleep(3)有关,也就是printf("signal over before unlock\n")紧跟的那个sleep。

此sleep好像影响到了pthread_cond_wait(&cond,&mtx)的**,至于为什么,暂时没找到答案,留给大神解决。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
4 [报告]
发表于 2014-06-02 22:59 |只看该作者
理论上说你需要pthread_mutexattr_setprotocol(&mtx, PTHREAD_PRIO_INHERIT),但Linux下的各种调度策略(RT, FIFO等)有没有正确实现这个功能就不知道了。

论坛徽章:
2
申猴
日期:2014-04-17 14:37:17CU十四周年纪念徽章
日期:2018-06-23 16:03:03
5 [报告]
发表于 2014-06-04 11:22 |只看该作者
确实是这样的,我把那行的sleep(3)时间减少点或者注释掉,就是test线程抢到锁。回复 3# rollin7


   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2014-06-04 12:34 |只看该作者
回复 1# tklist


    你这个问题的实质就是两个线程争一个锁,那么你的程序的行为就不应该依赖它们两个谁先拿到锁。如果你确实需要某个线程先于另外一个执行,那在程序逻辑设计上就要考虑这一点。

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
7 [报告]
发表于 2014-06-04 13:56 |只看该作者
这是讨论RT Linux吗?如果不是,那么结果是随机的,也就是undefined,时序用显式同步控制,不能依赖sleep这种东西。

论坛徽章:
0
8 [报告]
发表于 2014-06-04 15:00 |只看该作者
不应该指望操作系统的进程调度会按设想的方式操作。

论坛徽章:
0
9 [报告]
发表于 2015-04-03 01:51 |只看该作者
有没可能主线程一直获取锁没有释放,然后就发出等待的信号,然后test线程在还没获取锁时,无法进入等待消息的状态。具体不清楚系统怎么调度的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2015-04-03 10:10 |只看该作者
pthread_cond_wait做的事情就是unlock、等待条件变量的通知,然后lock,在lock这个操作上与其他lock调用一起竞争,谁会获得锁,是不一定的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP