Betrachten Sie diese einfache Zustimmung Beispiel:Reihenfolge der Themen in der Ausführung
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex
std::mutex mtx; // mutex for critical section
void print_block(int n, char c) {
// critical section (exclusive access to std::cout signaled by locking mtx):
mtx.lock();
for (int i = 0; i<n; ++i) { std::cout << c; }
std::cout << '\n';
mtx.unlock();
}
int main()
{
std::thread th1(print_block, 50, '*');
std::thread th2(print_block, 50, '$');
th1.join();
th2.join();
return 0;
}
Ist es immer gewährleistet, dass th1
wird der erste Thread sein die for-Schleife auszuführen?
Bedeutung, wenn ich dies tun:
th1.join();
th2.join();
Dann kann ich absolut sicher sein, dass th1
zuerst ausgeführt wird und dann th2
?
Bei Behandeln Sie bei der gleichzeitigen Programmierung niemals eine Hypothese über die Reihenfolge der Ausführung. Gehen Sie im Gegenteil davon aus, dass alle Situationen möglich sind. Dies macht Ihren Code zuverlässiger und paradoxerweise einfacher. –
[Sie verwenden 'std :: mutex 'falsch] (http://kayari.org/cxx/antipatterns.html#locking-mutex), sollten Sie niemals' std :: mutex :: lock() 'und 'std :: mutex :: unlock()'. Erstellen Sie stattdessen am Anfang von 'print_block()' 'std :: lock_guard' und lassen Sie den Mutex für Sie sperren und entsperren. –