Я учусь использовать pthread, mutexes и условные переменные, но все идет не так, как ожидалось.
ОСНОВНАЯ РЕЗЬБА: работает непрерывно, сигнализирует рабочему потоку, читает из файла _A.
РЕЗЬБА РАБОТЫ: режим ожидания до получения сигнала, запись в файл_A, возврат в режим ожидания (должен повторяться)
Так что я понимаю, что здесь нужен мьютекс, чтобы предотвратить чтение / запись в один и тот же файл и из одного потока. Я использую условную переменную для сигнализации рабочего потока.
Но по какой-то причине рабочий поток запускается только один раз . Нужно ли переустанавливать условную переменную или делать что-то еще?
Функция рабочего потока:
void* WriteTime(){
pthread_mutex_lock(&mutex);
pthread_cond_wait(&condition, &mutex);
/* Open File, Write to File, Close File */
pthread_mutex_unlock(&mutex);
}
Основная тема:
pthread_t timeThread;
pthread_create(&timeThread, NULL, &WriteTime, NULL);
while(gameConditionFulfilled == false){
/* Print status, gets user input into line */
/* If user enters "time", wake up WORKER_THREAD */
if(strcmp(line, "time")==0){
pthread_mutex_lock(&mutex);
pthread_cond_signal(&condition);
/* Read from file, print data, close file */
pthread_mutex_unlock(&mutex);
}
}
Кроме того, мое понимание кода выше выглядит так:
- Рабочий поток блокирует мьютекс. (Запускается до основного цикла)
- Рабочий поток cond_wait разблокирует мьютекс и ждет условия.
- Основной поток блокирует мьютекс.
- Состояние сигналов основного потока.
- Рабочий поток восстанавливает блокировку мьютекса, записывает в файл.
- Рабочий поток разблокирует мьютекс.
- Главный поток восстанавливает мьютекс и блокирует его.
- Основной поток читает файл.
- Основной поток разблокирует мьютекс.
- Рабочий поток восстанавливает блокировку?
Поведение на самом деле:
- Основной поток читает из файла
- Рабочий поток просыпается, пишет в файл, больше никогда не запускается