в чем проблема?
                  
                  
                  У меня код работает отлично в 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 часа сидел, пока Вы не подсказали)
Обсуждают сегодня