首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否在线程中调用pthread_cond_wait解除互斥锁?

是否在线程中调用pthread_cond_wait解除互斥锁?
EN

Stack Overflow用户
提问于 2020-12-12 09:47:09
回答 2查看 95关注 0票数 0

手册页表示,这个pthread_cond_wait原子地解锁互斥锁(按照pthread_unlock_mutex),并等待条件变量cond被发送信号

但是,任何其他线程都可以输入线程start_function,从而导致两个线程处于临界块中。

代码语言:javascript
运行
复制
    void* start_function(){
         pthread_mutex_lock(&mutex);
         // critical block
         pthread_mutex_unlock(&mutex);
    }
    
    int main(){
// code to create threads
        pthread_cond_wait(&cond, &mutex);
    }

那么,在上面的代码中,在点击pthread_cond_wait之后,它会解锁互斥对象吗?

EN

回答 2

Stack Overflow用户

发布于 2020-12-12 10:48:29

创建线程时不需要有条件-- .In互斥--一次只能运行一个关键区域。一个进程保持在关键区域有限的时间内,当它完成其工作时,没有一个进程停留在关键区域,然后使用条件信号,另一个线程也准备运行这个关键area.All。当进程停止在关键块之外时,它必须避免impasse.Also,您的例子必须是:

代码语言:javascript
运行
复制
void* start_function(){
         pthread_mutex_lock(&mutex);
           pthread_cond_wait(&cond, &mutex);
         // critical block or critical area

         // you can use signals here 
         pthread_mutex_unlock(&mutex);
    }
    
    int main(){
        // code to create threads
        for(int i=0;i<10;i++){
             pthreaf_create(x[i],&start_function,...,NULL);
       }
    }

可能是在程序的末尾,一些线程被卡在con_wait()上,所以需要一个广播()来释放所有线程。

票数 0
EN

Stack Overflow用户

发布于 2020-12-13 20:13:17

Man说,这个pthread_cond_wait原子地打开互斥锁(按照pthread_unlock_mutex),并等待条件变量cond被发送信号

是的,就在他们说这个功能之后

将被调用线程或未定义的行为结果锁定互斥锁。

(强调后加)。你接着说,

任何其他线程都可以输入线程start_function,从而导致两个线程处于临界块中。

如果您通过调用pthread_cond_wait()来调用未定义的行为而不包含指定的互斥对象,那么任何事情都可能发生--该行为是未定义的。这种未定义的行为可能仅仅表现为两个线程同时在关键区域执行,可能会产生任何后续效应,但也有可能程序随后崩溃,或者破坏内存,或者死锁,或者在所有密码上发推信息。

,那么在上面的代码中,在它点击pthread_cond_wait之后,它会解锁互斥对象吗?

说不出来。同样,行为也是未定义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65263524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档