而对于所有线程都是如此

while true for all threads

本文关键字:线程 于所      更新时间:2023-10-16
#include<stdio.h>
#include<pthread.h>
#define nThreads 5
pthread_mutex_t lock;
void *start(void *param) {
pthread_mutex_lock(&lock); 
while (true)
{
   //do certain things , mutex to avoid critical section problem
   int * number = (int *) param;
    cout<<*number;
}
pthread_mutex_unlock(&lock);
}
int main() 
{
    pthread_mutex_init(&lock, NULL);
    pthread_t tid[nThreads];
    int i = 0;
    for(i = 0; i < nThreads; i++) pthread_create(&tid[i], NULL, start, (void *) &i);
    for(i = 0; i < nThreads; i++) pthread_join(tid[i], NULL);
    pthread_mutex_destroy(&lock);
    return 0;
}

我的问题是是所有线程都在无限循环还是只有第一个线程在循环。 如果只有一个线程在循环,如何使所有线程无限循环,并且应该在 while 循环内或外部互斥锁:S !!

提前谢谢。

如果互斥锁如您所显示的那样位于循环之外,则只有一个线程可以进入该循环。 如果该循环永远运行(如果内部没有break语句,while (true)会这样做),那么实际上只有一个线程将进入循环,其余线程将被锁定。

移动需要保护的代码的互斥锁。 如果您希望所有线程并行循环,轮流访问公共结构,请在循环内移动互斥锁。

在这种情况下,

只有 1 个线程处于循环中,这也是第一个进入的线程,因为它永远不会解锁互斥锁,没有其他线程会进入,即所有其他线程将无限期等待。我想你想要的是这个:

while (true)
{
pthread_mutex_lock(&lock); 
   //do certain things , mutex to avoid critical section problem
   int * number = (int *) param;
    cout<<*number;
pthread_mutex_unlock(&lock);
}