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++.

Другие вопросы по тегам