并行线程运行一个线程它创建后(Pthread Run a thread right after it

2019-10-17 05:56发布

我有我使用并行线程的C程序。

我想新创建的线程,尽快为他们创建运行。

这背后的原因是,我的线程都初始化代码来设置信号处理程序,我必须确保的处理程序是准备好了,我的主线程发送一些信号之前。

我试着做pthread_yield只是我以后pthread_create ,但没有成功。

我怀疑它的确与众不同,但我在x86_64运行Linux 3.6。

谢谢

Answer 1:

或者你可以使用一个屏障,即呼叫pthread_barrier_wait (每个线程的常规早期,或在主线程初始化),以确保每一个相关的线程已经到达屏障(之后你的一些线程可以做你的调皮信号技巧)。 见这个问题 。



Answer 2:

如果你的目标是让主线程等待所有线程继续前进之前到达同一个点,我会建议使用pthread_barrier_wait

void worker(void*);

int main(int argc, char **argv)
{
    pthread_barrier_t b;
    pthread_t children[TCOUNT];
    int child;

    /* +1 for our main thread */
    pthread_barrier_init(&b, NULL, TCOUNT+1);

    for (child = 0; child < TCOUNT; ++child)
    {
        pthread_create(&children[child], NULL, worker, &b);
    }

    printf("main: children created\n");

    /* everybody who calls barrier_wait will wait 
     * until TCOUNT+1 have called it
     */
    pthread_barrier_wait(&b);

    printf("main: children finished\n");

    /* wait for children to finish */
    for (child = 0; child < TCOUNT; ++child)
    {
        pthread_join(&children[child], NULL);
    }

    /* clean-up */
    pthread_barrier_destroy(&b);

    return 0;
}

void worker(void *_b)
{
    pthread_barrier_t *b = (pthread_barrier_t*)_b;
    printf("child: before\n");
    pthread_barrier_wait(b);
    printf("child: after\n");
}


文章来源: Pthread Run a thread right after it's creation