Почему с 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]; не является валидной, размер массива должен быть константой времени компиляции.