pthread_mutex_lock не является экземпляром...?
Люди. Я пытался использовать мьютекс в качестве подстановки для атомарных переменных, но результаты показывают, что мьютекс не является экземпляром, потому что у "num" все еще есть половинное изменение, что делает условие if истинным. Это supose для работы, или я просто делаю:().
Комент, пожалуйста.. Спасибо:D
#include <iostream>
#include <pthread.h>
#include <mutex>
using namespace std;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int num = 450;
void* print1 (void* e){
while(1){
if(num != 450 && num != 201 ){
cout << "num-> "<<num<<endl;
}
pthread_mutex_lock(&mutex);
Sleep(0.5);
num = 450;
pthread_mutex_unlock(&mutex);
}
}
void* print2 (void* e){
while(1){
if(num != 450 && num != 201 ){
cout << "num-> "<<num<<endl;
}
pthread_mutex_lock(&mutex);
Sleep(0.5);
num = 201;
pthread_mutex_unlock(&mutex);
}
}
int main(){
pthread_t* threads1;
threads1 = new pthread_t;
pthread_t* threads2;
threads2 = new pthread_t;
//-------------------------------------
pthread_create(threads1,NULL,print1,(void*)NULL);
pthread_create(threads2,NULL,print2,(void*)NULL);
pthread_join(*threads1,(void**)NULL);
pthread_join(*threads2,(void**)NULL);
return false;
}
Результат:
num-> 450
num-> 450
num-> 450
num-> 450
...
Я ожидал:
(blanck)...
1 ответ
Ваш код не синхронизирует доступ для чтения к общему num
переменная с доступом на запись к той же переменной. Это хорошо видно при компиляции с -fsanitize=thread
:
WARNING: ThreadSanitizer: data race (pid=3082)
Write of size 4 at 0x0000006020d0 by thread T1 (mutexes: write M9):
#0 print1(void*) test.cc:19 (test+0x000000400df0)
#1 <null> <null> (libtsan.so.0+0x000000024459)
Previous read of size 4 at 0x0000006020d0 by thread T2:
#0 print2(void*) test.cc:27 (test+0x000000400e3f)
#1 <null> <null> (libtsan.so.0+0x000000024459)
Доступ на чтение требует определенной формы синхронизации, а не только права на запись. В противном случае вы можете даже не наблюдать обновления или видеть противоречивые данные. Детали являются следствием модели памяти C++.