有没有办法让每个类的对象都有一个提升线程?

Posted

技术标签:

【中文标题】有没有办法让每个类的对象都有一个提升线程?【英文标题】:Is there a way to have a boost thread per object of a class? 【发布时间】:2012-08-23 01:19:20 【问题描述】:

在我的代码中,我想创建一个类的一堆对象,然后给每个对象一个单独的线程,这样对象就可以彼此同时执行操作。

for (i = 0; i < ROBOTCOUNT; i++)

    Robot* r = new Robot;
    boost::thread t(r);
    robotList.push_back(r);

我想做类似上面代码的事情。如果是这样,代码不会编译,但这是我想要的一般想法。有谁知道如何做我想做的事?

谢谢

【问题讨论】:

@KerrekSB 这是我创建对象的类。 不开玩笑,但它是如何定义的?! 你真的不应该这样做。在线程和您需要做的工作类型之间强制进行静态映射通常效率极低。这就像一家快餐店,每个收银台有一名员工,每个车站一名员工,每张可能需要擦拭的桌子一名员工,依此类推。拥有一个固定的员工池并根据当前需求为他们分配工作更有意义。 @KerrekSB 抱歉,我不确定我是否完全明白你的意思。它有一个不带参数的构造函数。 【参考方案1】:

以下代码应该可以在 C++11 中运行并并行执行多个Worker::foo()s:

#include <thread>
#include <memory>
#include <vector>

struct Worker

    void foo();
;

int main()

    std::vector<std::unique_ptr<Worker>> workers;
    std::vector<std::thread>             threads;

    workers.reserve(N);
    threads.reserve(N);

    for (unsigned int i = 0; i != N; ++i)
    
        workers.emplace_back(new Worker);
        threads.emplace_back(&Worker::foo, workers.back().get());
    

    // ... later ...

    for (auto & t : threads)  t.join(); 


如果您相信您的元素引用保持有效,您甚至可以不使用唯一指针:

std::deque<Worker> workers;

// ...

for (unsigned int i = 0; i != N; ++i)

    workers.emplace_back(); // pray this doesn't invalidate
    threads.emplace_back(&Worker::foo, std::ref(workers.back()));

【讨论】:

如果您提前预订,则无需祈祷。 :) @GManNickG:我知道……但这仍然让我感到不安——你只知道有人会来动态添加工人,然后就没有上限了。反正我修好了!

以上是关于有没有办法让每个类的对象都有一个提升线程?的主要内容,如果未能解决你的问题,请参考以下文章

JVM架构

有没有办法根据派生类的可能性值范围来限制对象参数?

java 对象锁学习

在多线程系统中使用静态对象

[转]MFC子线程中更新控件内容的两种办法

多线程和CPU的关系