- 主题:这种多线程需求如何设计?
有个叫tbb的可以对付这种情况。
顺序读取顺序存储可以添加个tbb的排序buffer
我没用过tbb,但是看过文档,它是支持这种图结构的。
https://hongweidong.tumblr.com/post/102514371446/tbb-flow-graph
如果你要自己撸,就多线程执行myfunc,在myfunc结束时候push到一个priority_queue
然后另起一个thread,按顺序consume这个priority_queue中的结果。
【 在 capriccio 的大作中提到: 】
: 伪代码如下:
: myfun()
: {
: ...................
--
修改:allegro FROM 158.140.1.*
FROM 158.140.1.*
myfun()是热点函数,所有无关的代码(或者说所有不需要每次都在这个函数中初始化的代码,包括直接、间接调用到的代码)都要移出这个函数,跟提取无关代码到for循环外面是一个道理。
剩下就是怎么提高并发效率。多个消费者线程去读取数据采集程序产生的数据,是否有用?
--
FROM 114.241.227.*
搞个专门的程序做计算,把结果存个地方。 myfun 只是简单的取结果,不做计算。
【 在 capriccio (小草|长相守) 的大作中提到: 】
: 伪代码如下:
:
: myfun()
: {
--
FROM 74.88.40.*
线程池感觉可以试试
【 在 capriccio 的大作中提到: 】
:伪代码如下::myfun():{: mytype a,b,c,d;: getData(a,b);//从数据采
- 来自 水木社区APP v3.5.6
--
FROM 36.112.207.*
线程不要退出
thread()
{
while(thread_run){
myfun()
}
}
线程开cpu*2个
【 在 capriccio 的大作中提到: 】
: 伪代码如下:
: myfun()
: {
: ...................
--
FROM 120.245.113.*
Thread0()
{
mytype a,b,c,d;
getData(a,b);//从数据采集程序的缓存中读取a、b
QueueA[write_seq] = a;
QueueB[write_seq] = b;
write_seq++;
}
ThreaA()
{
myseq=write_seq;
while(!stopflag)
{
If(myseq<write_seq)
{
mytype c
FuncA(queueA[myseq], c);
QueueC[c_seq]=c;
C_seq++;
Myseq++;
}
}
}
ThreaB()
{
myseq=write_seq;
while(!stopflag)
{
If(myseq<write_seq)
{
mytype d
FuncB(queueA[myseq], d);
QueueD[d_seq]=d;
D_seq++;
Myseq++;
}
}
}
ThreaCD()
{
myseq=write_seq;
while(!stopflag)
{
If(myseq<c_seq && myseq<d_seq)
{
FuncC(queueC[myseq], queueD[myseq]);
Myseq++;
}
}
}
【 在 capriccio 的大作中提到: 】
: 伪代码如下:
: myfun()
: {
: ...................
--
FROM 91.37.206.*
假如想要运行时分配多线程,你需要一个类似golang语言协程go,或者rust中tokio spawn的东西,类似协程。
编译时分配,我一般是上来就开线程,然后用消息队列内部交互
【 在 capriccio 的大作中提到: 】
: 伪代码如下:
: myfun()
: {
: ...................
--
FROM 221.218.141.*
为什么不弄四个固定线程进行队列存取?
如果你做过fpga或dsp数字信号处理的话
就应该很清楚该怎么操作
【 在 capriccio 的大作中提到: 】
: 伪代码如下:
: myfun()
: {
: ...................
--
FROM 219.145.29.*
取数和写回结果专门用一个线程,比如就主线程,并且负责分配数据给计算线程。
计算线程提前创建好,数量最多等于cpu核数减一。 每个计算线程有自己的数据缓冲区,数据结构最好选用lock-free的ring buffer,buffer的大小,取决于你能容忍延迟的时间;最小用乒乓buffer,一片写入一片计算交替。
主线程轮流往每个计算线程的buffer里写输入数据,完了再轮流读每个buffer,把上一轮或者之前第N轮的结果取出写回。
【 在 capriccio (小草|长相守) 的大作中提到: 】
: 每次myfunc的计算结果要按照从缓存中取出数据的顺序进行排列,而且对实时性要求较高,
: 所以缓存也不大,不能攒一批数据后再并行调用myfunc。
:
: 虽然也能达到目的,但要满足上面的限制条件,程序会比较复杂,我只是想问问有没有我没有了解到的能比较简单的解决这个问题的方法。
--
FROM 183.128.141.*
固定线程+队列+同步机制
【 在 capriccio 的大作中提到: 】
: 伪代码如下:
:
: myfun()
: ...................
--
FROM 115.171.83.*