pthread:在主线程上执行函数

3
我正在寻找类似Cocoa的 -[NSObject performSelectorOnMainThread: withObject: waitUntilDone:] 方法的等效方法。
基本上,我有一个函数在单独的线程上执行一些工作,但必须执行一些需要在主线程上同步进行的调用。
2个回答

5
在Cocoa中,消息被添加到运行循环中,并在其迭代的一部分中清除。
为了模拟这个过程:
- 您需要一个运行循环 - 一个抽象的消息系统 - 在大多数情况下,需要一个引用计数机制 - 一种将这些消息添加到运行循环以进行预定执行的方法
定时器是一个不错的补充。
如果您想完全使用pthread接口实现类似功能,首先需要阅读有关条件pthread_cond_t的内容。
我不知道任何pthread接口与您尝试完成的任务具有1:1的关系。条件也可以在没有运行循环的情况下运行,因此如果您不重新使用运行循环实现,则可能需要考虑这一点。如果使用运行循环,则只需要锁定即可将消息添加到具有运行循环的线程中。

是的,我知道在Cocoa中如何运作。但问题是关于线程切换的。运行循环只能在单个线程上工作,但如果您想在另一个已存在的线程上执行某些功能怎么办? - Ivan

1

pthreads是一种非常低级的抽象,因此使用原始pthread没有简单的方法来实现这个功能。通常情况下,您需要写入文件描述符以唤醒主线程上的事件循环,然后将其传递给要运行的函数的指针。您甚至可以将指针值写入pipe(),然后让主线程执行它们。

要同步等待,您可以简单地拥有一个互斥锁和条件变量,以及这些执行请求对象上的完成标志。子线程在互斥锁/条件变量/完成标志上等待,然后在主线程(在互斥锁下)设置标志并发出信号。请求结构的清理将在子线程中完成。

更具体地说,如果您能提到在主线程上运行的事件循环,那将会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接