#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 !!
提前谢谢。答案 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);
}