Image

Imagetsukasa wrote in Imageru_cpp

Правильно применить lock

Добрый день!
Хочу правильно использовать mutex lock при программировании под Linux. Что делается - в программе инициализируется POSIX таймер



void
CRM::InitPosixTimer ()
{
struct timeval tv;
// init of real-timer
/* Set up sleep time for loops: */
signum = SIGRTMAX ; // NOTE -1 may be added for test
sleeptime.tv_sec = 1;
sleeptime.tv_nsec = 0;
/* Set up signal handler: */
sigfillset (&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = read_by_timer; // NOTE routine that reads card - ссулка на процедуру обработчика
sigaction (signum, &act, NULL);
/* Set up timer: */
memset (&se, 0, sizeof (se));
se.sigev_notify = SIGEV_SIGNAL;
se.sigev_signo = signum;
se.sigev_value.sival_int = 0;
status = timer_create (CLOCK_MONOTONIC, &se, &timer_id);
/*if (status < 0) {
perror("timer_create");
return -1;
} */// FIXME ADD error handler
ts.it_value.tv_sec = 1;
ts.it_value.tv_nsec = 0;
ts.it_interval.tv_sec = 1;
ts.it_interval.tv_nsec = 0;
// wait for the start of the next second
gettimeofday (&tv, NULL);
int sleeptime = 1000000 - tv.tv_usec - 70;
if (sleeptime < 0)
sleeptime++;
usleep (sleeptime); // NOTE 7 microsec is empirical delay to adjust close to second boundary
status = timer_settime (timer_id, 0, &ts, NULL);
// run the thing
cout << "InitPosixTimer: slept " << sleeptime << " microsec.\n";

}



и, как я понимаю, это автоматически приводит к тому, что он заводится в отдельном треде "автоматически" (я тредов не создаю). Далее, я пытался внедрить стандарнтыне pthread_mutex_lock/unlock как в процедуру, что вызывается по таймеру (накопитель данных), так и в процедуру главной программы, которая тоже имеет доступ к этим данным (обработчик данных? она крутится по таймеру "по версии" Qt). Ерунда в следующем: если в процедуре обработчика ограничить парой lock-unlock несколько операторов, то все вроде работает. Если несколько бОльшую часть (ничего особо медленного там нет) - приводит к зависанию программы. Видимо я что-то делаю не так, прошу совета.