精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
近期在linux下写生产消费者模型,用到了线程互斥,自然用到了pthread_开头函数,这些函数里pthread_mutex_trylock是尝试锁定,不会阻塞线程,觉得用了好,但是用了后使用互斥的函数功能异常,pthread_mutex_trylock卡了,开始找不到问题,还改用了std::mutex,同样不好用,后来认真查文档发现了我使用问题。有些知识点或代码片段不经常用,熟悉程度下降,导致了问题。
pthread_mutex_trylock后是不能使用pthread_mutex_lock函数,pthread_mutex_trylock本身也是包含lock功能,不要只看try,忘记了lock。如果再调用了pthread_mutex_lock,则整个函数以致于上层软件体系都受到了影响。代码如下:
int err = pthread_mutex_trylock(&mtx);//返回0表示锁定成功, if(0 != err) { if(EBUSY == err) { //The mutex could not be acquired because it was already locked.错误是EBUSY表示没办法锁定,其它线程占用了互斥体 return false; } } //pthread_mutex_lock(&mtx);这行要注释掉,正因为有了它才导致问题。
std::mutex也试下,kaldi里也用了这个,标准库里的互斥应该好用,但用了还是和pthread_mutex_trylock同样的问题,我把上面注释行注释了,功能正常,也就没查std::mutex的问题。
编译pthread要带上lpthread。