我正在使用pthreads學習編程。 如何編寫程序在單獨的線程上打印奇數和偶數。程序在單獨的線程上打印奇數和偶數
回答
傳遞一個指示器值,以指示如果線程應通過螺紋函數參數來打印奇數或偶數。
取決於相同,從0(對於偶數)或1(爲奇數)開始,並保持被2在螺紋和打印都遞增。
您還可以打印線程ID與指示哪個線程正在打印什麼號碼。
我假設你知道如何使用並行線程。
[更新]:鏈接pthreads 即使使用信號燈或互斥的,也很難讓你獲得輸出,以1,2,3等,你永遠不知道哪個線程會得到機會先執行。爲此,您可能必須使用一些高級概念,如線程優先級或使用條件變量的線程間通信。這些只是提示。我希望如果你通過鏈接,你會得到更多的信息。
我正在學習pthreads ..我正在尋找的解決方案是使用信號量的線程同步。輸出應該是1,2,3 .....但奇數和偶數應該打印在單獨的線程上。如果任何人都可以提供使用的細節。 還有任何研究pthreads的鏈接。 – user329013 2010-04-30 05:53:59
您需要兩個同步對象,例如信號量或條件變量。這個想法是,在線程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)
既然你想教自己的線程編程,我將讓你來此轉化爲實際的並行線程代碼。
+1。這個答案很好。它完全跳過了我的想法。 :) – Jay 2010-04-30 06:13:55
+1教學魚:) – 2010-05-23 09:45:46
在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();
}
}
--------
[。這是通過SO標記爲「遲到的回答到一個老問題,通過一個新的用戶提供該評論是在這種情況下,該問題是關於並行線程如此。 ,Java答案不是特別敏感,請考慮刪除它。 – danfuzz 2012-12-05 18:52:49
我想用一個條件變量和一個互斥體可以解決這個問題。
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 ...
我真的不明白它,當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
#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;
}
該用戶曾問過使用pthread的具體問題,但這也是可以通過描述* how *來解決問題的更好回答的問題類型;對於學習這樣做的人來說,即使使用您選擇的庫,代碼的幾個方面可能也不清楚。 – jimwise 2013-01-24 18:58:07
- 1. 多線程java程序打印偶數和奇數
- 2. C線程打印數字序列:偶數和奇數打印線程並行運行
- 3. 使用多線程打印奇數和偶數
- 4. 爲什麼我的偶數和奇數打印程序打印多次打印奇數?
- 5. 打印數組的奇數和偶數
- 6. java:使用2個線程打印奇數偶數
- 7. 在C中使用2個線程使用互斥打印奇數和偶數
- 8. 使用條件變量從不同的線程打印偶數和奇數
- 9. PHP - 打印偶數和(排序)數組的奇數
- 10. 而程序顯示偶數和奇數
- 11. Java:如何使用Executor框架打印來自2個獨立線程的奇數和偶數
- 12. 線程和函數'打印'
- 13. 奇數偶數的C#程序
- 14. 球拍 - 獨立的偶數和奇數?
- 15. 偶數和奇數的流程圖
- 16. 2個線程在順序打印數
- 17. ARM彙編程序:奇數或偶數
- 18. 如何在netbeans中打印1到10並打印奇數和偶數?
- 19. 如何打印出每個三個數字(偶數和奇數)?
- 20. 使用while循環打印一系列的偶數和奇數
- 21. 爲什麼我的程序在循環中不打印偶數?
- 22. 生成一個打印偶數和奇數的兩個數字序列?
- 23. 如何將兩個線程與偶數和奇數功能
- 24. 程序算上和奇數
- 25. 從文件中打印偶數行和奇數行
- 26. 嘗試從共享資源打印偶數和奇數
- 27. 無法打印偶數和奇數異步
- 28. 打印下10個偶數和奇數(java-script)
- 29. 此代碼如何打印奇數和偶數?
- 30. 如何不使用集合打印升序排列偶數和奇數降序
輸出應該1,2,3 .....但奇數和偶數應在單獨的線程被打印。 – user329013 2010-04-30 05:44:20
除非使用互斥鎖,否則無法保證兩個不同線程的輸出將以何種順序出現。 – QuantumPete 2010-04-30 05:56:02
@QuantumPete - 互斥體不保證順序。當線程A釋放互斥鎖時,不能保證線程B在線程A再次請求之前將被喚醒。 – 2010-04-30 05:58:52