C语言多线程程序调用pthread_barrier_wait失败原因排查
问题原因分析
- 第一点:返回值校验逻辑存在根本性错误
你当前对pthread_barrier_wait的返回值判断逻辑为:
该逻辑是永真命题:if(b != PTHREAD_BARRIER_SERIAL_THREAD|| b!= 0)pthread_barrier_wait调用成功时只会返回0(普通线程)或PTHREAD_BARRIER_SERIAL_THREAD(被选中的串行执行线程),不存在任何值可以同时等于这两个常数,因此无论调用是否成功,该判断都会触发,误报失败并退出程序。
正确的校验逻辑应为:
仅当返回值既不是0也不是串行线程标记时,才判定为调用失败。if (b != 0 && b != PTHREAD_BARRIER_SERIAL_THREAD) - 第二点:barrier初始化计数与实际参与等待的线程数不匹配
从运行日志可以看到,你除了2个计算线程外还有1个控制线程,如果控制线程也会调用这几个barrier的wait操作,那么你初始化barrier时传入的计数p(仅等于计算线程数)就会偏小,会导致线程等待超时或者触发参数错误,返回值为对应错误码(你日志中的-1一般对应EINVAL错误,就是barrier本身无效或者计数不匹配)。
确认所有会调用对应barrier的线程总数,将初始化时的第三个参数修改为实际的线程总数即可。 - 额外说明:你看到的日志输出混乱(比如
b : b : 0)是多线程并发调用printf没有加锁导致的输出穿插,属于正常现象,加线程锁同步输出即可解决。
内容的提问来源于stack exchange,提问作者e god
相关产品推荐
相关产品推荐

