仅当 n 个线程(包括其自身)正在运行时才停止线程

Posted

技术标签:

【中文标题】仅当 n 个线程(包括其自身)正在运行时才停止线程【英文标题】:Stop thread only if n threads are running including itself 【发布时间】:2020-08-18 03:03:47 【问题描述】:

我被要求在一个进程(48)中创建一些线程,但是只有当包括它自己在内的 6 个线程正在运行时,14 号线程才能停止。然而他们进入了一个无限循环。

这是我的进程中的线程应该执行的函数:

pthread_mutex_lock_t lock;
pthread_mutex_cond_t cond;
reached_6_threads = false;
    void *thread_function_P6(void *args)
    
        th *t = (th *)args;
        printf("started thread %d", t->id);
        if (t->id != 14)
        
            pthread_mutex_lock(&lock);
            while (th_no > 6)
            
                    pthread_cond_wait(&cond, &lock);
            
            if(!reached_6_threads && th_no==6)
                pthread_cond_wait(&cond, &lock);
                th_no--;
                reached_6_threads = true;
            
            th_no++;
            if (!reached_6_threads && th_no == 6)
            
                pthread_cond_broadcast(&cond);
                pthread_mutex_unlock(&lock);
            
        
        printf("threads running: %d\n", th_no);
        printf("stopped thread %d", t->id);
        pthread_exit(0);
    

lock 和 cond 在创建线程之前被初始化。

【问题讨论】:

【参考方案1】:

我不确定我是否理解您,但请在您的代码中注意:

a) 大部分代码都处于互斥锁下,这意味着它们不能真正并行运行

b) 线程 14 的运行与运行线程的数量无关

反正卡住的原因是:

a) 你的线程几乎是按顺序运行的

b) 线程 1-5 跳过 while 和两个 if,th_no 现在是 5(假设它被初始化为 0?)

c) 线程 6 将 th_no 提升到 6 并进入第二个 if,执行广播但没有线程卡在该条件锁上

d) 线程 7 及以上的线程首先进入 if 并等待永远不会中断的条件锁

我会建议以下解决方案。由于我还没有完全理解你,所以在这个例子中只允许运行 6 个线程,而不管它们的 id 是多少,你只需要做一些小的改动。

pthread_mutex_lock(&lock); 
while(th_no >= 6)pthread_cond_wait(&cond, &lock);
th_no++;
pthread_mutex_unlock(&lock); //Raise counter and unlock the mutex

/*
Thread function code here. Pay attention to critical code and use mutex.
*/

pthread_mutex_lock(&lock); //Acquire lock once again, decrease counter and broadcast if number of threads is ok now
th_no--;
if(th_no <= 5)
   if(pthread_cond_broadcast(&cond))
       // Error as it should return 0 on success
   

pthread_mutex_lock(&unlock);

如果这有帮助,请告诉我

【讨论】:

是的 th_no 被初始化为 0 你的建议很有用,非常感谢!

以上是关于仅当 n 个线程(包括其自身)正在运行时才停止线程的主要内容,如果未能解决你的问题,请参考以下文章

仅当日期小于另一个时才运行函数

仅当键盘阻止 UITextField / UITextView 时才向上移动 UIView

java守护线程

如何正确停止线程

pthread中取消线程

仅当我单击全屏选项卡时才以纵向播放视频,它会停止播放(Xcode 4.6)ios6.1