У меня есть следующий код, чтобы попытаться (и не удалось) защитить критическую область в моем коде.По сути, я хочу, чтобы оператор печати был полностью выполнен любым потоком, прежде чем какой-либо другой поток напечатает другой оператор.
В main.h
:
pthread_mutex_t printer_mutex;
В main.c
- первое, чтоПрограмма делает:
pthread_mutex_init(&printer_mutex, NULL);
Потоки создаются следующим образом (хотя я удалил некоторые проверки):
for(long t = 0; t < NUM_THREADS; t++) {
args[t].fw = fw;
args[t].deriv_init = deriv_init;
args[t].to_prove = fw.to_prove.at(i);
pthread_create(&threads[t], NULL, do_derivation_helper, (void *) &args[t]);
}
for(long t = 0; t < NUM_THREADS; t++) {
pthread_join(threads[t], NULL);
}
Затем в моем классе, который выполняет всю печатьв программе у меня есть следующее.Печать должна быть заблокирована, а затем разблокирована, когда она будет завершена.
void InfoViewer::rule_x_fires() {
// START CRITICAL REGION
pthread_mutex_lock(&printer_mutex);
cout << "INFO: Rule x fires" << endl;
pthread_mutex_unlock(&printer_mutex);
// END CRITICAL REGION
}
Нежелательный вывод, который я получаю:
INFO: Rule x firesINFO: Rule x fires
Т.е. строка не закончена до того, как какой-то другой поток начинает печатать.
Есть идеи?Я не правильно инициализирую?Я в порядке, используя стандартные темы стиля C в моей программе C ++?