2012-05-28 4 views
0

Я написал этот код:Тема создана (отдельно) никогда не выполняется

void* th (void* arg) 
{ 
    sleep(1); 
    for(int i=0; i<1000;i++) 
    { 
    fprintf(stderr,"%d\t",i); 
    } 
    pthread_exit(NULL); 
} 

int main(int argc, char** argv) 
{ 
    pthread_t thread; 
    pthread_attr_t attr; 
    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); 
    pthread_create(&thread,&attr,th,NULL); 
    pthread_attr_destroy(&attr); 
    return 0; 
} 

состояние отсоединение должно сделать поток не совмещён, поэтому он должен работать даже после того, как основной процесс terminated.But это не напечатайте цифры, все, что я вижу, это то, что поток завершен без печати ничего в stderr.
Почему не выполняется отдельная нить?

+0

Можете ли вы попробовать распечатать в физическом файле? –

ответ

6

A return из main нить соответствует эквиваленту exit всего процесса, поэтому ваш процесс будет завершен до того, как ваша нить может даже напечатать что-либо. Вместо этого используйте pthread_exit, чтобы прервать этот поток.

+0

И, судя по этому 'sleep (1)', он, вероятно, не сможет выполнить что-либо еще. –

+0

Так и основной процесс считается нитью? В этом коде есть два потока? –

+0

Нет, процесс изначально состоит из одного потока. После 'pthread_create' на мгновение появляются два потока. Затем возвращается 'main', что неявно вызывает' exit', и процесс перестает существовать. –

-1

В исходном образце кода есть условие выполнения. Добавьте спать (5) до attr_destroy.

+2

Нет, это право называть 'pthread_attr_destroy' немедленно. Кроме того, 'sleep' никогда не является решением для условий * гонки. –

+0

Вид. 1-й пункт да, но это не оспаривается. 2-й пункт. Конечно, это решение в этом случае, поскольку оно налагает упорядоченный детерминизм. Приведенный выше код выдавал бы результат, если бы процессор был очень, очень занят. Существует только 1 процесс, и он исчезает вместе с обоими потоками, потому что потоки не могут существовать вне процесса. – Barry

+1

Даже если он «работает» в большинстве условий, крайне безответственно преподавать «sleep» в качестве примитива синхронизации для кого-то, недавно изучающего темы. На самом деле, я почти дошел до того, что любой код, называющий 'sleep', глючит, т. Е. Почти ничего не может быть достигнуто с помощью' sleep', где 'sleep' на самом деле не ошибается. –

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