Verwenden Sie einen Mutex, es ist extrem einfach, sobald Sie Ihren Kopf herumkommen.
http://en.cppreference.com/w/cpp/thread/mutex
http://en.cppreference.com/w/cpp/thread/lock_guard
Code-Beispiel: nicht getestet in datarace führen kann und/oder Deadlock
#include <thread>
#inclue <mutex>
typedef struct
{
int a;
double b;
} data;
data glob;
mutex mymutex;
int main()
{
thread reader([]()
{
while(1)
{
mymutex.lock();
sleep(1s);
cout << glob;
mymutex.unlock();
}
});
thread writer1([]()
{
while(1)
mymutex.lock();
glob.a++;
mymutex.unlock();
});
thread writer2([]()
{
while(1)
mymutex.lock();
glob.b++;
mymutex.unlock();
});
int i;
cin >>i;
}
so wird dies die mutex verriegeln, wenn glob ändern und den Mutex entsperren wenn es fertig ist, sich zu verändern. Wenn der Mutex gesperrt ist, kann ein anderer Thread, der versucht, auf diesen Mutex zuzugreifen, dies nicht tun, wird also ein wenig warten und es dann erneut versuchen. schließlich wird es es fangen und in der Lage sein, es selbst zu sperren. Dann muss der andere Thread darauf warten, dass er entsperrt wird.
Der lock_guard, den ich verlinkt habe, ist eine sicherere Möglichkeit, deinen Mutex zu verwenden, funktioniert aber nur in Funktionen. Sie setzen es am Anfang einer Funktion und bleiben dann gesperrt, bis die Funktion zurückkehrt. Dies bedeutet, dass Sie nicht sicherstellen müssen, dass Sie den Mutex für jeden Rückpfad der Funktion entsperren, da dies automatisch erfolgt.
Mutex's haben ein Problem mit Deadlocks. Dies passiert, wenn Sie einen Mutex sperren und dann versuchen, den Mutex erneut im selben Thread zu sperren, bevor der Mutex entsperrt wurde. Es wird dann ewig warten, kann nicht entsperrt werden, und die anderen Threads können auch nicht fortgesetzt werden. Eine einfache Lösung besteht darin, mehrere Mutexe zu verwenden, wenn Sie Funktionen aus einem Mutex-Bereich aufrufen.
'std :: mutex' oder' std :: atomic' – vu1p3n0x
Sie müssen den Zugriff auf den gemeinsamen Status synchronisieren. Zum Beispiel ['std :: mutex'] (http://en.cppreference.com/w/cpp/thread/mutex). –
Sie möchten über [gegenseitiger Ausschluss] lesen (http://en.cppreference.com/w/cpp/thread). –