Почему с mutex работает код, а с rwlock нет?

Кода вместо rwlock был mutex все работало, а теперь зацыкливается

#include<iostream>
#include <pthread.h>
#include <unistd.h>
#include <cstring>
 
volatile int counter = 0;
volatile int loop = 0;
static pthread_rwlock_t RWLock = PTHREAD_RWLOCK_INITIALIZER;
volatile bool WorkFlag = true;

void* MyP(void *arg){
   while(WorkFlag) {
      pthread_rwlock_rdlock(&RWLock);
      if (counter % 100 != loop)
            std::cout << "Error:" << counter << " != " << loop << std::endl;
      usleep(10);
      pthread_rwlock_unlock(&RWLock);
   }
}

void* MyTh1(void *arg)
{
   for(int i = 0 ; i < 1000; ++i)
   {
      pthread_rwlock_wrlock(&RWLock);
      auto vl = ++counter;
      std::string str("123234254336");
      loop = vl % 100;
      pthread_rwlock_unlock(&RWLock);
      usleep(50);
   }
}

int main(int argc, char **argv){

   if (argc > 1 && !std::strcmp(argv[1], "MyTh1"))
   {
      int count = (argc > 2)? std::atoi(argv[2]) : 3;
      std::cout << "Количество потоков " << count << std::endl;
      pthread_t th[count];
      pthread_t thP[count];
      for(int i = 0 ; i < count; ++i)
      {
         pthread_create(&th[i], NULL, MyTh1, NULL);
         pthread_create(&thP[i], NULL, MyP, NULL);
      }
      for(int i = 0 ; i < count; ++i)
      {
         pthread_join(thP[i], NULL);
      }
      WorkFlag = false;
      for(int i = 0 ; i < count; ++i)
      {
         pthread_join(th[i], NULL);
      }
   }
   return 0;

}

Ответы (1 шт):

Автор решения: user7860670

Сразу бросаются в глаза следующие ошибки: volatile используется не по назначению, изменение WorkFlag из главного потока без синхронизации создает состояние гонки, результаты вызовов функций pthread_* игнорируются, pthread_join(thP[i], NULL); не может завершится, так как флаг завершения этих потоков WorkFlag выставляется потом.

Также запись pthread_t th[count]; не является валидной, размер массива должен быть константой времени компиляции.

→ Ссылка