C++20的semaphore:
counting_semaphore<1> start(0);
counting_semaphore<1> end(0);
mytype a,b,c,d;
auto t=std::thread([&](){
while(true)
{
start.acquire();//等待主线程准备数据
funA(a,c);
end.release();
}});
while(true)
{
getData(a,b);//从数据采集程序的缓存中读取a、b
start.release();//通知线程t开始执行funA
funB(b,d);
end.acquire();//等待线程t完成c的计算
funC(c,d);
}
简单测试了一下,这个线程的调度同步还是比较快的。
发现semaphore是个好东西,简单易用,性能也不错
【 在 capriccio 的大作中提到: 】
: 标 题: 这种多线程需求如何设计?
: 发信站: 水木社区 (Tue Oct 25 11:33:20 2022), 站内
:
: 伪代码如下:
:
: myfun()
: {
: mytype a,b,c,d;
: getData(a,b);//从数据采集程序的缓存中读取a、b
: funA(a,c);//传递a、c的引用,a作为输入,c作为返回值
: funB(b,d);//同上
: funC(c,d);
: }
:
: funA和funB的计算量相同,顺序执行的话共用时约0.3ms。funC的计算量忽略不计。
: myfun需要每秒执行4000次,所以顺序执行的速度不够,很快缓存就满了。
:
: 我试过openmp section,funA和funB各一个section,在4核CPU上运行时CPU占用翻倍(本来占满一个核,现在占满两个核),但速度没啥变化。
:
: 然后用标准库的thread,
: myfun()
: {
: mytype a,b,c,d;
: getData(a,b);//从数据采集程序的缓存中读取a、b
: auto t=std::thread(funA,std::ref(a),std::ref(c));
: funB(b,d);
: t.join();
: funC(c,d);
: }
: 这样的话,CPU占用没啥变化,速度也没啥变化。猜想可能是因为0.3ms的时间对于线程调度来说太短了。
:
: 所以请教各位大佬有没有什么好办法能比较简单的解决?
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 121.69.95.*]
:
--
FROM 123.113.99.*