TweentyOneGuns 2023-09-05 00:27 采纳率: 75%
浏览 20
已结题

创建多线程锁链的疑问

【求问help】我正在学习linux c 的多线程和互斥锁
里面的一个经典例子要求按顺序不断地输出a、b、c
解法是在一个循环里创建3个线程,每个线程获得一把独立的互斥锁,建立一条锁链,即上游线程输出了一个字符后,自动解开下游线程的锁,以此将四个线程首尾链接在一起,然后大家一起等待第一个线程解锁


我不能理解的是下面这段循环的代码,第一次循环的时候就已经上了第一把锁了,到第二次循环的时候又上了另一把锁,可是此时第一把锁并没有解开,后面那句创建线程的代码岂不是被锁住了?还怎么执行呢?


当然这段代码实际上并没有问题,我只是想知道自己哪里理解错了,谢谢!

pthread_mutex_t mutex[3];

for(i = 0; i<3; i++)
{
    pthread_mutex_init(mutex+i,NULL);
    pthread_mutex_lock(mutex+i);

    err = pthread_create(tid+i, NULL, thread_print, (void *)i);
    //err判断省略
}
pthread_mutex_unlock(mutex);

谢谢大家的回答,我没想到会有这么多人帮忙解答,甚至画图写代码来帮我理解,真的非常感谢
每个人的回答和代码我都认真看了一遍,引起我很多的思考,最后也是看懂了,互斥锁是用来处理线程间的问题,不是单个线程的问题,对于单个线程不管加多少把锁不管加在什么地方都没有意义,只要不重复上同一把锁就不可能把自己给锁住,我的疑问主要就是这个,当然也有一些之前一直没有仔细思考的地方也弄清楚了,还有我并不怀疑多线程的并行执行的机制
为了结题我得采纳一个,考虑从最早回答的和最能理解我的问题的症结的大哥里面选一个了,其他各位抱歉了哈,再次感谢!
  • 写回答

17条回答 默认 最新

  • 前网易架构师-高司机 游戏服务器领域优质创作者 2023-09-05 09:17
    关注

    你这段代码没有问题,具体要看你的线程回调里是怎么写的,首先你循环里的锁初始化上锁的逻辑, 对于每个锁都是独立的,互不影响

    img

    如果你把 pthread_mutex_lock改成同一把锁 mutex,那么在循环中就会被锁住的
    有更多多线程问题,或者其他解惑都可以找我,望采纳

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(16条)

报告相同问题?

问题事件

  • 系统已结题 9月13日
  • 已采纳回答 9月5日
  • 修改了问题 9月5日
  • 赞助了问题酬金15元 9月5日
  • 展开全部

悬赏问题

  • ¥15 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题