为什么这段代码会被阻止?

时间:2011-02-18 15:18:31

标签: c linux pthreads

我有一些代码需要一段时间才能完成。我希望它在一个单独的线程上处理,因为它主要被IO阻止。为此,我实现了以下内容,但是当调用线程运行background_picture_save()时,它似乎阻止了。为什么呢?

我正在尝试将save_picture()函数用作后台进程。

static void * threaded_save_picture(void * p);
static void * threaded_save_picture(void * p) 
{
    char optarg[512];

    strncpy(optarg, p, sizeof optarg);  optarg[sizeof optarg - 1] = '\0';
    fprintf(stderr,"%s()::%s\n",__FUNCTION__,optarg);
    save_picture(optarg);
    pthread_detach(pthread_self());
    return(p);
} /* threaded_save_picture() */

extern void background_picture_save(const char * const optarg);
void background_picture_save(const char * const optarg)
{
    pthread_t thrd;
    (void)pthread_create(& thrd, NULL, threaded_save_picture, (void *) optarg);
} /* background_picture_save() */

2 个答案:

答案 0 :(得分:0)

我认为你必须按此顺序进行:

pthread_detach(pthread_self());
save_picture(optarg);

答案 1 :(得分:0)

从你的观察中消除歧义。

当主线程块打印带有“where”的回溯时,用gdb运行程序。

使用strace显示阻止时进行的系统调用。

使用systemtap http://sourceware.org/systemtap/显示被阻止进程的内核回溯(虽然我发现pthreads支持最近才进入http://www.cygwin.com/ml/libc-alpha/2011-01/threads.html#00010)。