C++包含多个线程
C++ Holding a number of threads
我是C++(在Windows上)和线程的新手,目前我正在尝试使用互斥、信号量和事件来找到解决问题的方法。我正在尝试创建一个带有构造函数和名为Enter的方法的Barrier类。具有唯一方法Enter的类Barrier应该阻止任何进入它的线程,直到许多线程到达该方法。在构造函数处等待它接收的线程数。我的问题是如何使用锁来创建这种效果?我需要的是类似于反向信号量的东西,它保持线程直到达到计数,而不是像常规信号量那样让线程进入直到达到计数。任何关于如何进行这项工作的想法都将是非常棒的。谢谢Netanel。
可能:
在ctor中,存储限制计数并创建一个空信号量。
当一个线程调用Enter时,首先锁定一个互斥对象,这样你就可以安全地在里面旋转了。将线程计数增加到限制计数。如果尚未达到限制,请释放互斥锁并等待信号量。如果达到了极限,在循环中发出信号量[limit-1]次,将线程计数清零,(为下一次做好准备),释放互斥并从Enter()返回。任何正在等待信号量的线程,现在都已准备好/正在运行,应该只从它们的"Enter"调用返回。
互斥锁防止任何循环的已释放线程"再次进入",直到所有调用"Enter"并等待的线程都设置为运行并重置屏障。
您可以用条件变量实现它。
这里有一个例子:
我声明了25个线程,并通过WorkerThread函数启动它们。
我检查阻塞/取消阻塞线程的条件是节中的线程数是否小于2。(我添加了一些断言来证明我的coode的作用)。
我的代码只是睡在关键部分,然后我减少了关键部分的线程数量。
我还为cout添加了一个互斥对象,以获得干净的消息。#包括#包括#包括#包括#包括#包括#include/*断言*/使用命名空间std;
std::mutex m;
atomic<int> NumThreadsInCritialSection=0;
int MaxNumberThreadsInSection=2;
std::condition_variable cv;
mutex coutMutex;
int WorkerThread()
{
// Wait until main() sends data
{
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, []{return NumThreadsInCritialSection<MaxNumberThreadsInSection;});
}
assert (NumThreadsInCritialSection<MaxNumberThreadsInSection);
assert (NumThreadsInCritialSection>=0);
NumThreadsInCritialSection++;
{
std::unique_lock<std::mutex> lk(coutMutex);
cout<<"NumThreadsInCritialSection= "<<NumThreadsInCritialSection<<endl;
}
std::this_thread::sleep_for(std::chrono::seconds(5));
NumThreadsInCritialSection--;
{
std::unique_lock<std::mutex> lk(coutMutex);
cout<<"NumThreadsInCritialSection= "<<NumThreadsInCritialSection<<endl;
}
cv.notify_one();
return 0;
}
int main()
{
vector<thread> vWorkers;
for (int i=0;i<25;++i)
{
vWorkers.push_back(thread(WorkerThread));
}
for (auto j=vWorkers.begin(); j!=vWorkers.end(); ++j)
{
j->join();
}
return 0;
}
希望这能有所帮助,如果你有任何问题,告诉我,我可以评论或更改我的代码。
伪代码大纲可能如下所示:
void Enter()
{
Increment counter (atomically or with mutex)
if(counter >= desired_count)
{
condition_met = true; (protected if bool writes aren't atomic on your architecture)
cond_broadcast(blocking_cond_var);
}
else
{
Do a normal cond_wait loop-plus-predicate-check (waiting for the broadcast and checking condition_met each iteration to protect for spurious wakeups).
}
}
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- 一个线程等待多个线程事件
- C++ - 如何不错过来自多个线程的多个通知?
- 优化吞吐量:多线程与多进程
- 是boost :: asio :: thread_pool线程在多个线程上发布任务时的安全性
- 具有`k`线程的多线程程序的运行速度都比其顺序版本快
- 线程安全:多个线程从单个常量源读取
- 导入 DLL 的工作方式不同(VS2003 到 VS2010,多线程到多线程 DLL)
- 多线程和多核差异
- 这个线程池/多核模拟有什么问题
- 哪个线程以多线程结束
- 使用OpenCV、Boost线程和多个相机
- 几个线程的多个任务
- pthread - 使用一个线程访问多个对象
- 并发::parallel_fo(PPL)创建的线程太多
- 使用本机接口的多个java线程与多线程本机的单个java线程相比
- Boost Asio,多线程和多io_service
- 当多个高优先级线程在多个内核上运行时,Linux内核没有响应
- 多线程和多进程应用程序的锁定机制之间有什么区别