в чем проблема?
У меня код работает отлично в 100% случаев, у друга ломается через раз, у обоих убунта 20.04
pthread_rwlock_t rwlock;
void* reader(void*) {
int val;
int count = 0;
while (ongoing) {
check(pthread_rwlock_rdlock(&rwlock));
if (!ongoing)
return NULL;
count++;
printf("Reader guess it is %d \n", val = rand() % 9 + 1);
if (val == var) {
printf("Reader win! Attempts: %d \n", count);
ongoing = false;
}
check(pthread_rwlock_unlock(&rwlock));
while (ongoing && !pthread_rwlock_tryrdlock(&rwlock))
pthread_rwlock_unlock(&rwlock);
}
check(pthread_rwlock_unlock(&rwlock));
while (ongoing && !pthread_rwlock_tryrdlock(&rwlock))
pthread_rwlock_unlock(&rwlock);
return NULL;
}
void* writer(void*) {
printf("Right number is %d \n", var = rand() % 10 + 1);
for (int i = 0; i < 10 && ongoing; ++i) {
check(pthread_rwlock_unlock(&rwlock));
while (!pthread_rwlock_trywrlock(&rwlock))
pthread_rwlock_unlock(&rwlock);
check(pthread_rwlock_wrlock(&rwlock));
}
ongoing = false;
printf("Writer ends the game \n\n");
check(pthread_rwlock_unlock(&rwlock));
}
void play(int value) {
pthread_t t;
bool f = true;
for (int i = 0; i < value; i++) {
ongoing = true;
check(pthread_rwlock_init(&rwlock, NULL));
if (f) {
check(pthread_rwlock_wrlock(&rwlock));
check(pthread_create(&t, NULL, reader, NULL));
writer(NULL);
} else {
check(pthread_rwlock_rdlock(&rwlock));
check(pthread_create(&t, NULL, writer, NULL));
reader(NULL);
}
check(pthread_join(t, NULL));
check(pthread_rwlock_destroy(&rwlock));
f = !f;
}
}
int main() {
srand(time(NULL));
play(3);
}
запускаю в онлайн компиляторе и тоже всё работает, может у друга с убунтой что то не так? Но я двух знакомых просил, у обоих косячно работает, у меня одного всё нормально
Лучше было б на pastebin...
Ща поглядим
сори, не пользовался песочницами для плюсов, учту
Код без хотя бы одного #include... Шли полный код, шли через paste bin, это даже не скомпилировать
https://pastebin.com/EUQ8GqAr
Скорее всего тут просто гонки между потоками...
Что это значит?)
А что за on going?
Тогда точно гонки, раз не знаешь...
булевское просто, чтобы вайл работал в reader, а когда цикл в writer заканчивается - ongoing = false
Доступ К общим данным потоков надо синхронизировать, так нельзя писать, будут гонки (data race). Несогласованный доступ потоков к общим переменным.
Энтони Уильямс, Параллельное программирование в С++, целая книга, читай
преподаватель в вузе ничего об этом в примере не написал)) спасибо большое, пойду почитаю
Твой ongoing должен быть как минимум atomic variable, или защищен мьютексом или другими примитивами синхронизации потоков. А в таком виде это UB, и так оно и работает. У тебя случайно да, у друга нет
А вы проходили многопоточность?
у нас это как отдельный предмет - прикладное программирование, поэтому всё очень сжато объясняют
сказали вот так можно поток сделать, вот так удалить и пару слов как им друг друга подождать
Это значит вы это не проходили. Так что не стоило браться за такие программы, хоть и с виду оно выглядит просто...
да, выглядело действительно просто, зато в итоге 4 часа сидел, пока Вы не подсказали)
Обсуждают сегодня