Почему этот код блокируется? - PullRequest
1 голос
/ 18 февраля 2011

У меня есть некоторый код, выполнение которого занимает короткое время. Я бы хотел, чтобы он обрабатывался в отдельном потоке, так как он в основном заблокирован 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 голосов
/ 03 мая 2011

Уберите двусмысленность из ваших наблюдений.

Запустите программу с помощью gdb, когда блоки основного потока напечатают обратную трассировку с помощью «где».

Используйте strace для отображения системных вызовов, выполняемых при блокировке.

Используйте systemtap http://sourceware.org/systemtap/, чтобы показать обратные трассировки ядра для заблокированного процесса (хотя я вижу, что поддержка pthreads только недавно вошла в http://www.cygwin.com/ml/libc-alpha/2011-01/threads.html#00010).

0 голосов
/ 18 февраля 2011

Я думаю, вы должны сделать это в следующем порядке:

pthread_detach(pthread_self());
save_picture(optarg);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...