2010-04-30 71 views
4

我正在使用pthreads學習編程。 如何編寫程序在單獨的線程上打印奇數和偶數。程序在單獨的線程上打印奇數和偶數

+0

輸出應該1,2,3 .....但奇數和偶數應在單獨的線程被打印。 – user329013 2010-04-30 05:44:20

+0

除非使用互斥鎖,否則無法保證兩個不同線程的輸出將以何種順序出現。 – QuantumPete 2010-04-30 05:56:02

+0

@QuantumPete - 互斥體不保證順序。當線程A釋放互斥鎖時,不能保證線程B在線程A再次請求之前將被喚醒。 – 2010-04-30 05:58:52

回答

1

傳遞一個指示器值,以指示如果線程應通過螺紋函數參數來打印奇數或偶數。

取決於相同,從0(對於偶數)或1(爲奇數)開始,並保持被2在螺紋和打印都遞增。

您還可以打印線程ID與指示哪個線程正在打印什麼號碼。

我假設你知道如何使用並行線程。

[更新]:鏈接pthreads 即使使用信號燈或互斥的,也很難讓你獲得輸出,以1,2,3等,你永遠不知道哪個線程會得到機會先執行。爲此,您可能必須使用一些高級概念,如線程優先級或使用條件變量的線程間通信。這些只是提示。我希望如果你通過鏈接,你會得到更多的信息。

+0

我正在學習pthreads ..我正在尋找的解決方案是使用信號量的線程同步。輸出應該是1,2,3 .....但奇數和偶數應該打印在單獨的線程上。如果任何人都可以提供使用的細節。 還有任何研究pthreads的鏈接。 – user329013 2010-04-30 05:53:59

6

您需要兩個同步對象,例如信號量或條件變量。這個想法是,在線程B做相反的事情之後,線程A在打印和釋放信號B之前請求信號量A.

的想法是,後線程A請求旗語A,它將信號量它請求下一次下降到0。旗語甲它將阻塞,直到線程B釋放信號量。

在僞代碼,這看起來像:

initialization: 
    // set semA to 1 so that the call to sem_wait in the 
    // even thread will succeed right away 
    sem_init(semA, 1) 
    sem_init(semB, 0) 

even_thread: 
    to_print = 0; 

    loop: 
     sem_wait(semA); 

     write(to_print); 
     to_print += 2 

     sem_post(semB) 

odd_thread: 
    to_print = 1 

    loop: 
     sem_wait(semB) 

     write(to_print) 
     to_print += 2 

     sem_post(semA) 

既然你想教自己的線程編程,我將讓你來此轉化爲實際的並行線程代碼。

+0

+1。這個答案很好。它完全跳過了我的想法。 :) – Jay 2010-04-30 06:13:55

+0

+1教學魚:) – 2010-05-23 09:45:46

-1

在JAVA ...

public class EvenOddGenTest { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 

NumberGenerator numGenerator = new NumberGenerator(); 

OddGenerator oddGen = new OddGenerator(numGenerator); 
EvenGenerator evenGen = new EvenGenerator(numGenerator); 

oddGen.start(); 
evenGen.start(); 

} 

} 
------------------ 

public class OddGenerator extends Thread { 

public NumberGenerator numGen; 

public OddGenerator(NumberGenerator numberGen) { 
this.numGen = numberGen; 
} 

public void run() { 
int i = 1; 
while (i <= 9) { 

numGen.printOdd(i); 
i = i + 2; 
} 
} 

} 

---- 

public class EvenGenerator extends Thread { 

public NumberGenerator numGen; 

public EvenGenerator(NumberGenerator numberGen) { 
this.numGen = numberGen; 
} 

public void run() { 
int i = 2; 
while (i <= 10) { 
numGen.printEven(i); 
i = i + 2; 
} 
} 
} 
------ 


public class NumberGenerator { 

boolean oddPrinted = false; 

public synchronized void printOdd(int number) { 

while (oddPrinted == true) { 
try { 
wait(); 

} catch (InterruptedException e) { 

} 
} 

System.out.println("NumberGenerator.printOdd() " + number); 
oddPrinted = true; 
notifyAll(); 

} 

public synchronized void printEven(int number) { 
while (oddPrinted == false) { 
try { 
wait(); 

} catch (InterruptedException e) { 

} 
} 

oddPrinted = false; 
System.out.println("NumberGenerator.printEven() " + number); 
notifyAll(); 
} 
} 

-------- 
+0

[。這是通過SO標記爲「遲到的回答到一個老問題,通過一個新的用戶提供該評論是在這種情況下,該問題是關於並行線程如此。 ,Java答案不是特別敏感,請考慮刪除它。 – danfuzz 2012-12-05 18:52:49

3

我想用一個條件變量和一個互斥體可以解決這個問題。

 

    pthread_mutex_t count_mutex  = PTHREAD_MUTEX_INITIALIZER; 
    pthread_cond_t condition_var = PTHREAD_COND_INITIALIZER; 

    void *functionCount1(); 
    void *functionCount2(); 

    int count = 0; 
    #define COUNT_DONE 200 

    main() 
    { 
     pthread_t thread1, thread2; 

     pthread_create(&thread1, NULL, &functionCount1, NULL); 
     pthread_create(&thread2, NULL, &functionCount2, NULL); 

     pthread_join(thread1, NULL); 
     pthread_join(thread2, NULL); 

     exit(0); 
    } 

    // Print odd numbers 

    void *functionCount1() 
    { 
     for(;;) 
     { 

      // Lock mutex and then wait for signal to relase mutex 
      pthread_mutex_lock(&count_mutex); 


      // Check if the last emitted value was an odd; if so, wait till 
      // an even is printed 
      if (count % 2 != 0) { 
       pthread_cond_wait(&condition_var, &count_mutex); 
      } 

      count++; 
      printf("Counter value functionCount1: %d\n",count); 
      pthread_cond_signal(&condition_var); 

      if(count >= COUNT_DONE) { 
      pthread_mutex_unlock(&count_mutex); 
      return(NULL); 
      } 
      pthread_mutex_unlock(&count_mutex); 
     } 
    } 


    // print even numbers 
    void *functionCount2() 
    { 
     for(;;) 
     { 

      // Lock mutex and then wait for signal to relase mutex 
      pthread_mutex_lock(&count_mutex); 

      // Check if the last emitted value was an even; if so, wait till 
      // an odd is printed 
      if (count % 2 == 0) { 
       pthread_cond_wait(&condition_var, &count_mutex); 
      } 

      count++; 
      printf("Counter value functionCount2: %d\n",count); 

      pthread_cond_signal(&condition_var); 

      if(count >= COUNT_DONE) { 
      pthread_mutex_unlock(&count_mutex); 
      return(NULL); 
      } 
      pthread_mutex_unlock(&count_mutex); 
     } 
    } 

    Output:: 
    ubuntu:~/work$ gcc even_odd.c -lpthread 
    ubuntu:~/work$ ./a.out 
    Counter value functionCount1: 1 
    Counter value functionCount2: 2 
    Counter value functionCount1: 3 
    Counter value functionCount2: 4 
    Counter value functionCount1: 5 
    Counter value functionCount2: 6 
    Counter value functionCount1: 7 
    Counter value functionCount2: 8 
    Counter value functionCount1: 9 
    Counter value functionCount2: 10 
    ... 

+0

我真的不明白它,當count最初爲0時,這個條件if(count%2!= 0)會失敗,並且沒有調用pthread_cond_wait(&condition_var,&count_mutex);.稍後count ++會增加,pthread_cond_signal(&condition_var)被調用,但是當沒有等待線程時(pthread_cond_wait未被調用),它會向誰發送信號? – 2016-08-02 13:29:44

0
#include "stdafx.h" 
#include "TestC.h" 
#include"afxmt.h " 

///////////////////////////////////////////////////////////////////////////// 
// The one and only application object 

CWinApp theApp; 

using namespace std; 

CEvent myEvent1; 
CEvent myEvent2; 

UINT PrintEven(LPVOID pParam) 
{ 
    int nNum = 2; 
    while(nNum < 20) 
    { 
     myEvent2.Lock(); 
     CString str; 
     str.Format("%d\n",nNum); 
     printf(str); 
     nNum += 2; 
     myEvent1.SetEvent(); 
    } 
    return 1; 
} 

UINT PrintOdd(LPVOID pParam) 
{ 
    int nNum = 1; 
    while(nNum < 20) 
    { 
     //myEvent1.Lock(); 
     CString str; 
     str.Format("%d\n",nNum); 
     printf(str); 
     nNum += 2; 
     myEvent2.SetEvent(); 
     myEvent1.Lock(); 
    } 
    return 1; 
} 
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 
{ 
    AfxBeginThread(PrintOdd, 0); 
    AfxBeginThread(PrintEven, 0); 
    Sleep(1000); 
    return 1; 
} 
+0

該用戶曾問過使用pthread的具體問題,但這也是可以通過描述* how *來解決問題的更好回答的問題類型;對於學習這樣做的人來說,即使使用您選擇的庫,代碼的幾個方面可能也不清楚。 – jimwise 2013-01-24 18:58:07

相關問題