Доброго дня!
Есть программка которая берет данные и может их вывести один раз (просто через cout), а может (если установлена опция) — переодически брать данные и выводить их на экран (через ncurses).
Куски кода:
struct thread_args {
ncui *ui;
mystat *stat;
};
void loop(void* threadarg) {
thread_args *args = reinterpret_cast<thread_args *>(threadarg);
while (true) {
info = args->stat->getinfo(); // берем данные
args->ui->setinfo(info); // передаем их в ncurses gui
...
args->ui->tick(); // даем команду на отрисовку
sleep(sleep_sec);
}
int main() {
...
if (options.loop) {
mystat stat; // class откуда берутся данные
ncui ui = ncui(); // class для работы с ncurses
thread_args args;
args.ui = &ui;
args.stat = &stat;
...
pthread_create(&mythread, NULL, (void *(*) (void *)) &loop, (void *) &args);
ui.loop() // тут идет взаимодействие с пользователем через ncurses
} else {
mystat stat1;
info = stat1.getinfo();
cout << info;
...
}
}
void ncui::tick() {
pthread_mutex_lock(&tick_mutex);
... // фактическое рисование на экране через ncurses
pthread_mutex_unlock(&tick_mutex);
}
Этот код работает нормально с gcc 4.2 и 4.3.
При использовании gcc 4.4 в той же системе (ubuntu 9.10) код виснет в ncui::tick() на
pthread_mutex_lock(&tick_mutex);
При этом, все начинает работать, если просто убрать в main() дополнительный объект класса mystat:
else {
mystat stat1;
info = stat1.getinfo();
cout << info;
...
}
Но это решение не подходит. Нужен и одиночный вывод в cout.
Еще помогает если убрать pthread_mutex_lock/pthread_mutex_unlock, но это тоже не подходит, т.к. tick() может дергается еще и из самого ncui.
Посоветуйте — как пофиксить?