2013-03-09 103 views
-1

我想知道如何在每次按下某個鍵時運行線程以休眠一段時間。例如,如果我按兩次相同的鍵,它應該有兩個線程睡一會兒。Pthread和鍵盤

MUST使用並行線程C++

老實說,我已經嘗試了很多方法,但我仍然不知道如何解決它。

很抱歉,如果我的英語不是很好:)

UPDATE

這是我的代碼:

#include <pthread.h> 
#include <iostream> 
#include <unistd.h> 

using namespace std; 
pthread_mutex_t mutex; 
pthread_cond_t cond; 
int a; 
void* executer2(void*) 
{ 
    pthread_mutex_lock(&mutex); 
    while (a > 0) { 
     pthread_cond_wait(&cond, &mutex); 
    } 
    cout << "Thread: " << pthread_self() << endl; 
    sleep(a); 
    pthread_mutex_unlock(&mutex); 
} 

void* executer(void*) 
{ 
    int key; 
    while (1) { 
     pthread_mutex_lock(&mutex); 
     key = cin.get(); 

     if (key == 'a') { 
      cout << "Sleep for 4 seconds" << endl; 
      a = 4; 
     } else if (key == 'b') { 

      cout << "Sleep for 8 seconds" << endl; 
      a = 8; 
     } else { 

      cout << "Sleep for 2 seconds" << endl; 
      a = 2; 
     } 

     pthread_cond_signal(&cond); 

     pthread_mutex_unlock(&mutex); 

     sleep(1); 
    } 
} 

int main() 
{ 
    pthread_t tr, t; 
    pthread_attr_t attr; 
    pthread_mutex_init(&mutex, NULL); 
    pthread_cond_init(&cond, NULL); 

    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); 
    pthread_create(&tr, &attr, executer, NULL); 
    pthread_create(&t, &attr, executer2, NULL); 
    pthread_join(tr, NULL); 
    pthread_join(t, NULL); 

} 
+1

你有什麼具體的問題?你試過什麼了?線程是否成功產卵? – Cameron 2013-03-09 05:31:32

+0

我可以創建一個線程,但是如果我再次按下一個鍵,我必須等到我的另一個線程完成我的新線程執行 – Chu 2013-03-09 05:33:33

+0

從你所說的,當按下一個鍵時你將線程連接在一起,只是不加入它們並簡單地創建一個新的,就像你對第一個一樣。 – Benjamin 2013-03-09 05:40:25

回答

1
  1. 既然你想每次創建一個線程你按一個鍵,並且按鍵處理程序在executer中,則應將代碼移動到中以創建。

  2. executer製作成sleep 1秒。在閱讀按鍵後,但它似乎不是你想要的。只需刪除調用sleep(1)以獲得立即的迴應

  3. executer代碼似乎表明要花費調製由取決於輸入鍵線程睡眠的時間。您可以將睡眠時間作爲參數傳遞給executer2,如該函數的參數void *所示。我們的想法是時間值轉換爲void *,在創建線程時通過它,將它轉換回內executer2 INT:

    // executer2 thread creation 
    pthread_create(&t, &attr, executer2,(void *)a); 
    

    executer2

    void *executer2(void *arg){ 
        int a = (int)arg; 
        // ... 
    

    線程創建代碼應該在executer2之後開關,並且您不應該再需要全局變量a

  4. 您正在使用互斥鎖來鎖定executer2的代碼。這將阻止所有睡眠線程同時睡在一起。您將不得不移除鎖以允許它們同時睡眠(但將鎖鎖定在文本輸出周圍)。

  5. 你說你希望有一個C++解決方案。你可以從使用stl中的線程庫中獲益,它使用更高級別的結構包裝操作系統線程原語(在你的案例中是pthread),並且更容易操作,特別是對於參數。一旦你有當前的代碼工作,這將是一個很好的練習來轉換你的程序使用這個庫。

+0

非常感謝!我需要我的條件嗎? – Chu 2013-03-09 16:43:46

+0

什麼?執行器1和2之間不需要同步邏輯,並且唯一的同步。執行程序2實例之間的問題由互斥體解決。 – didierc 2013-03-09 16:54:44