我有一些代码需要很短时间才能完成。我希望它在一个单独的线程上处理,因为它主要被IO阻塞。为此,我实现了以下功能,但是当调用线程运行时,它似乎会阻塞。为什么?
我试图让background_picture_save()函数作为后台进程工作。

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() */

最佳答案

从你的观察中去掉模糊性。
当主线程块用“where”打印回溯时,用gdb运行程序。
使用strace显示阻塞时正在进行的系统调用。
使用systemtaphttp://sourceware.org/systemtap/显示被阻塞进程的内核回溯(尽管我看到pthreads支持最近才进入http://www.cygwin.com/ml/libc-alpha/2011-01/threads.html#00010)。

关于c - 为什么此代码被阻止?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5043006/

10-11 21:17