适用于所有线程

时间:2013-11-17 15:43:17

标签: c++ multithreading

#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;
}

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

提前谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

在这种情况下,只有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);
}