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

我们必须编写将创建两个线程的程序。第一个线程将要求从键盘输入字母,然后它将信号发送到第二个线程,等待它。然后它将把这封信改成大写,如果这封信不是'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;

}


呼如林
浏览 342回答 2
2回答

料青山看我应如是

您应该初始化互斥量变量。除此之外,似乎第一个线程将等待事件dadam。确保为线程生成了事件first。

qq_花开花谢_0

您不初始化互斥量或条件变量。它们具有静态持续时间,因此会参与默认初始化,但是不能保证会产生可用状态。和的通用方法是使用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);&nbsp;(反之亦然)。但是主要的问题似乎是实现中的竞争条件。在其循环的每次迭代中,函数都在继续之前first()等待CV dadam,而在其循环的每次迭代时,函数都在继续之前second()等待CV dudum。如果可以引导它,这可能会起作用,但是当您第一次启动这两个功能时,任何一个都不能继续等待,以表示另一个正在等待的CV。您dadam从主线程发出信号,但是如果主线程在first()开始等待之前发送信号,则该信号将丢失。请注意,pthread_cond_signal()将目标CV的相关互斥锁锁定时可以执行一段时间。不需要这样做,但有些人建议将其作为一种良好做法。
打开App,查看更多内容
随时随地看视频慕课网APP