2015-02-21 4 views
0

Я видел следующий фрагмент кода для потоковой передачи в Linux в Интернете. Но когда я запускаю его, все потоки, похоже, спят вместо основного потока. Зачем? Кроме того, без сна (5) утверждение «Успешно созданный поток» выполняется 3 раза вместо 2? Может ли кто-нибудь объяснить это поведение? Благодаря Составлено с использованием: НКУ -pthread check.cПочему все мои потоки спали, используя sleep()?

и мое о/р: Первый поток processingn Тема создана successfullyn Второй поток processingn Тема создана successfullyn

Первые две строки печатаются с отставание 5 секунд и следующие 2 через 5 секунд. Почему дочерние потоки спали вместо основного?

#include<stdio.h> 
#include<string.h> 
#include<pthread.h> 
#include<stdlib.h> 
#include<unistd.h> 
pthread_t tid[2]; 

void* doSomeThing() 

{ 
    unsigned long i = 0; 
    pthread_t id = pthread_self(); 

    if (pthread_equal(id,tid[0])) 
    { 
     printf("\n First thread processingn"); 
    } 
    else 
    { 
     printf("\n Second thread processingn"); 
    } 
    return NULL; 
} 
int main(void) 
{ 
    int i = 0; 
    int err; 
    while (i < 2) 
    { 
     err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL); 
     sleep(5); 
     if (err != 0) 
      printf("\ncan't create thread [%s]", strerror(err)) 
      else 

       printf("\n Thread created successfullyn"); 
     i++; 
     // sleep(5); 
    } 
    pthread_join(tid[0],NULL); 
    pthread_join(tid[1],NULL); 

    return 0; 
} 
+0

Почему 'doSomeThing' занимает' void arg'? – user2357112

+1

Возможно, вам понравилось читать «* detached *» vs. «* joinable *» состояние потока, чтобы понять, почему ваши потоки не выглядят так, как будто они закончились. Для справки: http://man7.org/linux/man-pages/man3/pthread_attr_setdetachstate.3.html – alk

+0

Как вы написали, ваш код не компилируется. (должен быть 'void * arg', но вы написали' void arg') –

ответ

1

Почему, по вашему мнению, все твои потоки спали? Читать некоторые pthreads tutorial & pthreads(7)

Похоже, что ваши темы очень быстро прекращаются. Вы должны присоединились к ним (например, перед sleep, или где-то внутри main) с помощью pthread_join(3)

for (int i=0; i<2; i++) { 
    void* retval = NULL; 
    pthread_join(tid[i], &retval); 
    // in your case, since doSomething gives NULL : 
    assert (retval == NULL); 
} 

или вы должны быть созданы отдельные темы, см pthread_create(3) & пример pthread_attr_init(3) & pthread_attr_setdetachstate(3) и т.д ....

И вы должны были закодировать (поскольку вы ожидаете, что doSomeThing получит аргумент NULL):

void* doSomeThing(void* arg) { 
    assert (arg == NULL); 

BTW, пожалуйста, скомпилируйте с помощью gcc -Wall -Wextra -g и узнайте, как использовать отладчик gdb.

Вы, вероятно, следует вызов fflush(3) в соответствующих местах (потому что stdio(3) часто buffered), например, звоните fflush(NULL); в конце doSomeThing

Подробнее о undefined behavior и много работать, чтобы избежать этого.

Важно сделать fflush(NULL); внутри потоков, из которых вы ожидаете выход (по крайней мере, до их окончания). Ваш вопрос не связан с sleep, а с буферизацией. И printf часто буферизуется по очень важным причинам. И вы также должны принять привычку заканчивать printf строку управления форматом с \n (так как это часто смывает буфер). Помещение \n только в начале строки формата printf - это плохая привычка (она должна быть в конце).


BTW, путем коррекции void* doSomething(void*arg) линии (так как с void arg, как указано в оригинальной версии вашего вопроса код даже не компилируется!) Я наблюдаю следующий вывод при компиляции:

% gcc -Wall -g x.c -pthread -o xx 
    x.c: In function 'doSomeThing': 
    x.c:11:19: warning: unused variable 'i' [-Wunused-variable] 
     unsigned long i = 0; 
        ^

затем выполнение с:

% ./xx 

    Thread created successfully 

    First thread processing 

    Thread created successfully 

    Second thread processing 

Так код, указанный в вопросе не ведет себя на моем компьютере, как описано в этом вопросе. Поэтому Harsh S. Kulshrestha должен отредактировать свой вопрос, указав точный исходный код, полную команду компиляции и точный вывод. FWIW, моя система Linux/Debian/Sid на x86-64, gcc - это версия 4.9.2, libc - это Debian GLIBC 2.19-15

+0

Я думаю, что первым параметром 'pthread_join' является' pthreat_t', а не 'pthread_t *'. – UDPLover

+0

Спасибо, исправлено! –

+0

@BasileStarynkevitch Спасибо за ответ, но я думаю, что thread tid [1] продолжает спать, потому что утверждение - «Обработка вторых потоков» печатается только через 5 секунд. –

Смежные вопросы