2017-05-23 2 views
0

ich habe einen solchen CodeSynchonisation 2 Themen C++ linux

#include <iostream> 
#include <thread> 
#include <mutex> 
#include <iostream> 
#include <unistd.h> 
using namespace std; 

bool isRunning; 
mutex locker; 

void threadFunc(int num) { 
    while(isRunning) { 
     locker.lock(); 
     cout << num << endl; 
     locker.unlock(); 

     sleep(1); 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    isRunning = true; 
    thread thr1(threadFunc,1); 
    thread thr2(threadFunc,2); 

    cout << "Hello World!" << endl; 

    thr1.join(); 
    thr2.join(); 
    return 0; 
} 

wenn Sie diesen Code ausgeführt ich warte Ausgabe wie zu bekommen:

1 
2 
1 
2 
1 
2 
1 
2 
... 

aber ich dont't dass bekommen und wie etwas bekommen Sie stattdessen:

1 
2 
1 
2 
2 <--- why so? 
1 
2 
1 

und wenn ich diesen Code ausführen unter Windows mit #include <unistd.h>-ersetzenund sleep(1)-Sleep(1000) der Ausgang i erhalten, ist genau das, was ich will, das heißt 1212121212.

Warum so ist und wie das gleiche Ergebnis auf Linux zu erreichen?

Antwort

1

Es betrifft die Planung von Threads. Manchmal kann ein Thread schneller ausgeführt werden. Anscheinend wird Thread 2 einmal schneller ausgeführt, und Sie erhalten ... 1 2 2 ... Nichts falsch daran, weil Mutex nur dafür sorgt, dass nur ein Thread gleichzeitig zählt und nichts mehr. Es gibt Ungewissheiten wie wenn ein Thread schlafen geht und wenn er aufgeweckt wird, usw. All dies braucht nicht immer die gleiche Zeit in den zwei Threads die ganze Zeit.

Damit die Threads abwechselnd ausgeführt werden, ist eine andere Semaphor-Anordnung erforderlich. Nehmen wir zum Beispiel zwei Semaphoren, s1 und s2. Die Anfangswerte von s1 und s2 sind jeweils 1 und Null. Betrachten Sie den folgenden Pseudocode:

// Thread 1: 
P (s1) 
print number 
V (s2) 

// Thread 2: 
P (s2) 
print number 
V (s1) 
+0

okay, es ist klar, aber wie man fortlaufenden Druck von diesen Threads erreichen? Welche Synchronisationsmechanismen sollten verwendet werden? – borune

+0

Ich habe meine Antwort aktualisiert – kjohri

+0

du bist ein Gott des Muttithreading! – borune