C语言 在Linux上使用waitid中的__WALL

ymdaylpp  于 2023-10-16  发布在  Linux
关注(0)|答案(1)|浏览(174)

此代码示例基于Michael Burr在How can I wait for any/all pthreads to complete?中的答案。
我尝试修改解决方案,以依赖于waitid。文档中说Linux的waitid应该接受一个__WALL标志,这也应该让它等待线程的子线程,但是我得到了错误(EINVAL):

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <errno.h>
#include <unistd.h>

static
void msleep(int ms)
{
    struct timespec waittime;

    waittime.tv_sec = (ms / 1000);
    ms = ms % 1000;
    waittime.tv_nsec = ms * 1000 * 1000;

    nanosleep( &waittime, NULL);
}

void* threadfunc( void* c)
{
    int id = (int) c;
    int i = 0;

    for (i = 0 ; i < 12; ++i) {
        printf( "thread %d, iteration %d\n", id, i);
        msleep(10);
    }

    return 0;
}

int main()
{
    int i = 4;

    for (; i; --i) {
        pthread_t* tcb = malloc( sizeof(*tcb));

        pthread_create( tcb, NULL, threadfunc, (void*) i);
    }

    msleep(40);

    int r;
    siginfo_t info;
    while(0<=(r=waitid(P_ALL, 0, &info, WEXITED|__WALL)) || errno == EINTR)
        ;
    printf("r=%d %m\n", r);

#if 0
    pthread_exit(0);
#endif

    return 0;
}

你知道为什么不管用吗?如果不明显的话,我想从main得到与pthread_exit(0)相同的结果--所有线程都应该运行到完成。

qyyhg6bp

qyyhg6bp1#

注意:从Linux 4.7开始,“__WALL”也可以在“waitid()”中使用。
__WALL不能用于waitid()
根据我所读到的,__WALL(等待所有子节点,无论克隆或非克隆)只能与waitpid()wait3()wait4()一起使用。

相关问题