为了账号安全,请及时绑定邮箱和手机立即绑定

c ++ Linux中的线程无限期等待

c ++ Linux中的线程无限期等待

呼如林 2021-04-10 23:19:42
我们必须编写将创建两个线程的程序。第一个线程将要求从键盘输入字母,然后它将信号发送到第二个线程,等待它。然后它将把这封信改成大写,如果这封信不是'E',它将发送另一个信号到线程1。在您键入的字母不再为'e'之前,将再次使运行线程成为运行线程的原因。两个线程之间的通信有点像打乒乓球,或者至少应该如此。在下面,我添加了我编写的代码。还没有完成,但是有一个我无法解决或无法找到解决方案的问题。当我尝试运行此代码时,它卡住了。看起来两个线程都在等待信号,所以什么也没有发生。怎么了?#include <iostream>#include <fstream>#include <string>#include <pthread.h>#include <stdlib.h>using namespace std;pthread_mutex_t mut;pthread_cond_t dadam;pthread_cond_t dudum;char x;void *first(void *arg) {  while(1) {      pthread_mutex_lock(&mut);    pthread_cond_wait(&dadam, &mut);    cout << "Type a letter\n";    cin >> x;     pthread_mutex_unlock(&mut);    pthread_cond_signal(&dudum);  }}void *second(void *arg) {   while(1) {    pthread_cond_wait(&dudum, &mut);     pthread_mutex_lock(&mut);    char y;    y = toupper(x);    cout << y << endl;    pthread_mutex_unlock(&mut);    pthread_cond_signal(&dadam);  }}int main(){  pthread_t nun;  pthread_t nuno;  pthread_create(&nun, NULL, &first,NULL);  pthread_create(&nuno, NULL, &second,NULL);  pthread_cond_signal(&dadam);  pthread_join(nun, NULL);  pthread_join(nuno, NULL);  return 0;}
查看完整描述

2 回答

?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

您应该初始化互斥量变量。

除此之外,似乎第一个线程将等待事件dadam。确保为线程生成了事件first


查看完整回答
反对 回复 2021-04-16
?
qq_花开花谢_0

TA贡献1835条经验 获得超6个赞

您不初始化互斥量或条件变量。它们具有静态持续时间,因此会参与默认初始化,但是不能保证会产生可用状态。和的通用方法是使用pthread_cond_init()和pthread_mutex_init(),但是如果默认值足够,那么您还可以使用初始化器宏:


pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t dadam = PTHREAD_COND_INITIALIZER;

pthread_cond_t dudum = PTHREAD_COND_INITIALIZER;

您也尝试dudum不持有指定的互斥体而等待CV 。调用时,您需要保持互斥量pthread_cond_wait():


pthread_mutex_lock(&mut);

pthread_cond_wait(&dudum, &mut); 

(反之亦然)。


但是主要的问题似乎是实现中的竞争条件。


在其循环的每次迭代中,函数都在继续之前first()等待CV dadam,而在其循环的每次迭代时,函数都在继续之前second()等待CV dudum。如果可以引导它,这可能会起作用,但是当您第一次启动这两个功能时,任何一个都不能继续等待,以表示另一个正在等待的CV。您dadam从主线程发出信号,但是如果主线程在first()开始等待之前发送信号,则该信号将丢失。

请注意,pthread_cond_signal()将目标CV的相关互斥锁锁定时可以执行一段时间。不需要这样做,但有些人建议将其作为一种良好做法。


查看完整回答
反对 回复 2021-04-16
  • 2 回答
  • 0 关注
  • 339 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信