同时从多个线程调用widget的信号函数安全吗?当多个线程同时调用某个窗口小部件的信号时,Qt会使用某种内部互斥锁来提供自己数据结构的安全性吗?
据我所知,这是安全的,一个信号函数的N个同时调用将导致一个连接的信号的N个顺序调用。
我说的对吗?
备注:调用信号函数的线程是用boost创建的。我认为,这对这个问题并不重要。我不能使用其他线程,因为这些线程不仅与GUI相关,而且它们服务于程序的许多部分。
发布于 2013-08-28 10:01:18
简而言之,你不是调用一个信号,而是发出一个信号。然后,Qt在内部处理信号连接到的任何时隙的触发。
发出信号并使其触发插槽可能是线程安全的,也可能不是线程安全的,这取决于连接类型。
有关更多信息,请阅读here。
我认为boost创建的线程将会是一个问题--信号/槽机制依赖于QThread和QObject的基础设施。如果你可以使用QThread而不是boost线程,这可能会更好,也更简单。
发布于 2013-08-28 17:20:57
所以你(可能)会因为使用boost线程而出现问题。
但是,有一个简单的解决方案:确保使用Qt::QueuedConnection连接信号和插槽。(这是当对象位于不同的线程中时,使用QThreads自动执行的操作)。
如果需要同步执行插槽(即所有插槽必须在发出信号的代码继续执行之前完成),请使用Qt::BlockingQueuedConnection
发布于 2013-08-28 20:52:08
这取决于连接。如果是直接连接,则发射线程将用于将信号传送到连接的插槽。这个安全吗?这取决于插槽。特别是,QWidget上的插槽无法处理此问题。如果该连接已排队,则存储该信号。接收器对象有一个关联的QThread,该线程有一个事件循环,该事件循环将存储的信号传递给接收器。
您的问题描述了排队连接的行为。这是一种有效的可能性。Qt事件循环是线程安全的。向它传送信号和从它调用插槽都得到了适当的保护。由于每个接收器只有一个QThread,这意味着排队的信号是按顺序传送的。
https://stackoverflow.com/questions/18477448
复制相似问题