【问题标题】:Multithreaded Program Gets Interrupted with "Alarm Clock"多线程程序因“闹钟”而中断
【发布时间】:2013-06-10 20:18:04
【问题描述】:

所有,我的多线程程序不断被中断,并且正在将“闹钟”写入​​控制台。

经过一番谷歌搜索,很多人提到这与“睡眠”有关,但我的线程中没有一个调用睡眠。当前进程是

  1. 将函数和参数传递给启动函数
  2. Starter 函数启动 n 线程并将 (1) 中的函数和适当的参数传递给每个线程
  3. 每个线程都使用给定的参数运行函数,每个函数都是独立的,仅依赖于参数和本地内存。
  4. 启动函数加入每个创建的线程pthread_join(cur_thread[i], 0)

我一直在尝试使用stracegdb 来找出是什么发出了信号。 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;
}

【问题讨论】:

  • 示例代码和输出与预期输出???您很好地概述了它,但特别是在线程方面,导致问题的是实现中的细微差别。
  • 我提供了一些实现代码,该程序在当前状态下非常健壮...如果我应该提供更多,请通知我。
  • 请注意,这只发生在经过大量计算的卷积函数上。卷积函数可能需要大约 7 秒的极其繁重的计算,对于thread_join,这变成 2800 秒
  • 您的代码是否调用了不在您的命令下的任何非系统/libc 函数?
  • @alk 我相当有信心,除了 malloc/free 我没有...我正在使用-pthread 进行编译...虽然我没有在链接阶段包含标志,但我觉得编译时的-pthread 就够了吗?

标签: c++ pthreads signals libcurl


【解决方案1】:

这与libcurl 有关。我不得不使用

 setopt(handle, CURLOPT_NOSIGNAL, 1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多