2013-06-10 3 views
1

Все, моя многопоточная программа продолжает прерываться, и «Будильник» записывается на консоль.Многопоточная программа прерывается с помощью «Будильник»

После некоторых поисковых запросов многие люди упоминают, что это связано с «сном», но ни один из моих потоков не вызывает сон. Текущий процесс

  1. Pass функции и параметры функции стартера
  2. функция стартер начинает n потоков и передает функцию из (1) и соответствующих параметров для каждого потока
  3. Каждого поток запускает функцию с параметрами он был задан, каждая функция независима только от параметров и локальной памяти.
  4. Starter функция включается каждой созданной нити pthread_join(cur_thread[i], 0)

Я пытался использовать strace и gdb, чтобы выяснить, Что метание сигнала. gdb просто говорит «Нет стека» и strace совсем не останавливается ... Я думаю, что я собираюсь написать обработчик сигнала SIGALRM ...

У меня нет идей, может кто-нибудь предложить какие-либо предложения?

Новая информация: Это похоже на libcurl. Я использую его для получения mjpegs из сети. Если я не использую libcurl, SIGALRM не срабатывает. Мой Libcurl код выглядит следующим образом:

static void * capture_function(void * cam) 
{ 
    MyData * camera = (MyData *)cam; 

    //Create the curl 
    camera->m_curl = curl_easy_init(); 

    //Connect to the camera 
    curl_easy_setopt(camera->m_curl, CURLOPT_URL, camera->m_ip); 

    //Set up our callback functions 
    curl_easy_setopt(camera->m_curl, CURLOPT_WRITEFUNCTION, CurlWriteCallback); 
    curl_easy_setopt(camera->m_curl, CURLOPT_WRITEDATA, (void *)camera); 
    curl_easy_perform(camera->m_curl); 

    camera->m_state = camera->m_state & ~CAPTURING; //Remove the capturing flag; 
    curl_easy_cleanup(camera->m_curl); 

    return NULL; 
} 
+2

Пример кода и выходного значения по сравнению с ожидаемым выходом ??? Вы четко изложили это, но, в частности, с потоками, именно нюансы в реализации вызывают проблемы. – ChrisCM

+0

Я поставил некоторый код реализации, программа довольно надежна в этом текущем состоянии ... Пожалуйста, сообщите мне, если я должен предоставить больше. – Constantin

+0

Обратите внимание, что это происходит только от функций свертки после большого количества вычислений. Функции свертки могут занимать около 7 СЕКУНД чрезвычайно тяжелых вычислений, которые превращаются в 2800 секунд для 'thread_join' – Constantin

ответ

2

Это было связано с libcurl. Мне пришлось использовать

setopt(handle, CURLOPT_NOSIGNAL, 1); 
Смежные вопросы