繁体   English   中英

C - 如何在其中一个线程用条件变量向主线程发出信号后终止所有线程?

[英]C - How to terminate all threads after one of them signals the main thread with a condition variable?

在我的程序中,主线程启动多个子线程,为计数器锁定一个互斥锁,然后休眠直到计数器达到 N。

在无限循环中,其他线程做一些工作,它们在每次迭代中交替增加计数器。 一旦计数器 == N,其中一个必须向主线程发出信号,并且所有子线程都必须结束。

我的问题是我不确定何时应该锁定计数器互斥锁并在线程函数中发出信号,因为一旦计数器变为 NI 设法唤醒主线程并退出一个子线程,但其他线程当他们都应该终止时,将继续努力工作。

我的问题是,如何检查 counter == N 是否仅通过其中一个线程发送信号,而其他线程仅在没有任何信号的情况下返回? 这是否可以通过在每次迭代中只锁定互斥锁一次来完成,以便检查其值 (== N)? 如果是,如何?

void *thread_function(void *arg) {
    int *id = (int *) arg;

    for (;;) {
        pthread_mutex_lock(&mutex_counter);
        counter++;
        if (counter == N) {
            pthread_cond_signal(&cond);
            pthread_mutex_unlock(&mutex_counter);
            return NULL;
        }
        if (counter > N) {
            pthread_mutex_unlock(&mutex_counter);
            return NULL;
        }
        pthread_mutex_unlock(&mutex_counter);
        
        sleep(random());
        // do some work here
        // ...
        // finish work
    }

上面代码的问题在于,尽管所有线程都终止了,但它们执行的循环比所需的迭代次数少了一次,因为计数器在 if 子句之前增加了(因此计数器将为 N,但没有完成 N 次工作循环)。

但是,如果我将计数器放在函数的末尾,线程将做比需要更多的工作,这会弄乱我的程序。

为什么在主线程中锁定反互斥锁? 为什么需要从其他踏板向主踏板发送信号? 如果您只有一个全局计数器并且所有线程都在增加它,那么您可以在主线程中启动所有线程,记住它们的线程 ID,然后使用 while(counter<N); 等待。 操作说明。 毕竟,只需使用 pthread_cancel 杀死所有线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM