亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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條經驗 獲得超8個贊

您應該初始化互斥量變量。

除此之外,似乎第一個線程將等待事件dadam。確保為線程生成了事件first。


查看完整回答
反對 回復 2021-04-16
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

您不初始化互斥量或條件變量。它們具有靜態持續時間,因此會參與默認初始化,但是不能保證會產生可用狀態。和的通用方法是使用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 關注
  • 419 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號