从另一个线程调用函数

Uwo*_*wop 4 c++ qt multithreading boost

我的应用程序在启动时有多个线程。我需要线程 A 能够强制线程 B 运行一个函数(也有参数。)我试过在谷歌上搜索但找不到我需要的东西,很多堆栈溢出文章似乎与我在做什么。我不确定我是否只是为此使用了错误的术语,也许这就是我找不到所需信息的原因。如果他们的线程库中有一个选项,我愿意使用 Boost,如果有,如果你能指出一些示例代码的方向,我可以看看哪个能满足我的需要。我的应用程序也已经使用 QT,尽管我从未使用过 QT 线程库,所以我也不知道它是否包含这个。

基本上我需要做的是这个。

//Thread A
void ThreadA()
{
   //Do work to get data
   //Pass Data to another function, and have thread B run it.
   ThreadB.Run(data,arg2,arg3);
}
Run Code Online (Sandbox Code Playgroud)

alp*_*ter 6

没有办法明确地做到这一点。您可以在线程之间传输消息,例如使用events,这将触发所需方法的调用。但是目标线程必须在循环中,等待消息。这是唯一一种可以强制线程进入另一个子程序的方法。

抽象例子:

// in ThreadB [the target thread]

std::vector<Message> messages;
bool wait_message;

// ...

while(wait_message) {
    if(messages.size() > 0) {
        // process messages
    }
}

// ...
Run Code Online (Sandbox Code Playgroud)

对于另一个线程:

// in ThreadA

// ... 

messages.push_back(Message("call_my_method", some_data));

// ... 
Run Code Online (Sandbox Code Playgroud)

Message(仅举例):

class Message {
private:
    std::string _what;
    void* _data;

public:
    Message(const std::string& what, void* data) : _what(what), _data(data) { }
    Message(const Message& inst) : _what(inst._what), _data(inst._data) { }

    const std::string& what() const { return _what; }
    void* data() const { return _data; }
};
Run Code Online (Sandbox Code Playgroud)

仅对于函数调用,您可以使用std::functionandstd::bind和 只传输回调,它提供一些固定的签名(例如void(void)),以及您的消息。

  • 这样你需要一些锁 (2认同)