gpt4 book ai didi

c++ boost::thread 在主线程上执行代码?

转载 作者:可可西里 更新时间:2023-11-01 16:10:51 33 4
gpt4 key购买 nike

是否有可能在调用 boost::thread 运行一些指令后返回到主线程?

我的代码基于前摄器模式,但是某个函数可能需要一些时间,所以为了不阻塞整个程序,我创建了一个线程来运行这个函数。当这个函数结束时,我需要调用另一个函数,但它必须在主线程上运行。我有一个连接池,它不是线程安全的,我真的很想避免互斥锁。

有没有一种稳定的方法可以在主线程上运行一个函数(在另一个线程上调用)?

就像在 ObjectiveC 中一样 performSelectorOnMaintThread

最佳答案

如果你想让一个函数在主线程中运行,你将不得不实现某种类型的消息传递系统。因此,例如,您将启动主线程,然后启动工作线程。工作线程将完成它的工作,而主线程将等待来自工作线程的一些返回值(即主线程将检查消息队列或类似性质的东西)。当工作线程结束时,它会向主线程的消息队列传递一个结构(即消息),其中包含指向它希望主线程运行的函数的指针。您的消息可以非常简单:

struct message
{
typedef void (*func_ptr)(void); //or whatever your function signature would be

func_ptr function;
bool finished;

message(): function(NULL), finished(false) {}
};

因此当工作线程完成后,它将创建一个新消息,初始化消息中的函数指针,并将该消息推回主线程正在等待的队列中。然后主线程从队列中读取消息,并调用该函数。

顺便说一句,让主线程“等待”而不必将其保持在循环中并耗尽 CPU 周期的有效方法是在主线程和主线程之间使用信号量或条件变量(如 boost::condition) worker 。

还有一点要注意……“消息队列”就是一个 std::queue<message>具有主线程读取和工作线程写入的适当锁定访问权限。如果需要线程间双向通信,也可以有另外一个消息队列供主线程写入,工作线程读取。

关于c++ boost::thread 在主线程上执行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6071415/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com