2013-09-30 71 views
-1

我是多線程新手。 當我運行下面的程序它給輸出爲什麼同步不在多線程應用程序中發生C++

Function1 
Function2 
1000...1001 

,但是當我調試它給輸出如預期的計劃。

1000...1001 
Function1 
Function2 

所以,我認爲在直接運行時(沒有調試)模式,它正在得到一些同步問題。但有一件事讓我感到困惑,我正在使用mutex,那麼爲什麼會出現同步問題?

請幫幫我。

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

using namespace std; 

pthread_mutex_t myMutex; 
void * function1(void * arg); 
void * function2(void * arg); 
void * function0(void * arg); 
int count = 0; 
const int COUNT_DONE = 10; 

main() 
{ 
    pthread_t thread1, thread2, thread0; 
    pthread_mutex_init(&myMutex, 0); 
    pthread_create(&thread0, NULL, &function0, NULL); 
    pthread_create(&thread1, NULL, &function1, NULL); 
    pthread_create(&thread2, NULL, &function2, NULL); 
    pthread_join(thread0, NULL); 
    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 
    pthread_mutex_destroy(&myMutex); 
    return 0; 
} 

void *function1(void * arg) 
{ 
    cout << "Function1\n"; 
} 

void *function0(void *arg) 
{ 
    int i, j; 
    pthread_mutex_lock(&myMutex); 
    for (i = 0; i <= 1000; i++) 
    { 
    for (j = 0; j <= 1000; j++) 
    { 
    } 
    } 
    cout << i << "..." << j << endl; 
    pthread_mutex_unlock(&myMutex); 
} 

void *function2(void * arg) 
{ 
    cout << "Function2\n"; 
} 
+0

什麼是空循環?編譯器可能會刪除它們。另外,請解釋互斥鎖應如何強制執行命令 – Leeor

+0

@Leeor:Mtex用於同步目的! –

+1

你不應該在'function2'和'function1'上使用互斥嗎? – streppel

回答

1

...得到一些同步問題」 你在哪裏看到的一個問題?

線程輸出可能以任何順序出現,因爲線程在任何情況下都不同步。

該互斥量僅用於一個線程。

而且

Function1 
1000...1001 
Function2 

可能是一個可預期的和有效的結果。

除了:

1000 
Function1 
... 
Function2 
1001 

修改function1()function2()像這樣:

void *function1(void * arg) 
{ 
    pthread_mutex_lock(&myMutex); 
    cout << "Function1\n"; 
    pthread_mutex_unlock(&myMutex); 
} 

void *function2(void * arg) 
{ 
    pthread_mutex_lock(&myMutex); 
    cout << "Function2\n"; 
    pthread_mutex_unlock(&myMutex); 
} 

將保護程序從生產的我的例子輸出的第2位。

+0

我也對其他兩個函數應用了互斥鎖。但結果也不會改變 –

+0

你肯定不會得到那些第二種情況。互斥鎖保護混合3個輸出語句,但不影響它們的順序。 – alk

+0

你可能會考慮如何以及爲什麼**互斥量會影響3個輸出的順序。 – alk

相關問題