gcc 4.4 и pthreads
От: o.palij  
Дата: 28.04.10 18:51
Оценка:
Доброго дня!

Есть программка которая берет данные и может их вывести один раз (просто через 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.

Посоветуйте — как пофиксить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.