而对于所有线程都是如此
while true for all threads
#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);
}
相关文章:
- 适用于大型数组的无复制线程安全环形缓冲区
- __thread Embarcadero c++ 10.1 中不创建特定于线程的变量
- 为什么线程对类变量所做的更改没有影响?
- 让线程池的所有线程执行给定函数
- 线程启动延迟 - 通知所有未唤醒所有线程
- Openmp:所有线程由于一个线程中的延迟而停止
- 条件_variable和unique_lock如何适用于线程安全列表
- 通过为每个线程独占使用对象(不在线程之间共享)是保护该类的成员函数所必需的
- 主函数跳过线程并且不加入以显示所需的输出
- 多线程 - 降低效率,也许是由“ false共享”所产生的
- 我有 12 个 CPU,1 个插槽,每个插槽 6 个内核,每个内核 2 个线程 - 这些信息如何对应于 MPI 和 Op
- 加载的 OpenGL 函数是特定于上下文还是特定于线程?(视窗)
- 在所有线程未完成打印时提升线程
- C++标准库容器相对于所包含对象的线程安全性
- Boost:创建一组线程并等待所有线程的正确习惯用法是什么
- 多线程程序只适用于打印语句
- 计算创建 n 个线程所花费的时间
- stl或boost中是否存在用于线程间通信的线程安全结构,其行为类似于队列
- C++线程:可以lock_guard拥有一个unique_lock所拥有的互斥对象
- boost::thread_group中的所有线程是否共享关于boost::recursive_mutex的相同线程