Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 两个不同的插槽调用相同的方法-线程安全_C++_Multithreading_Qt - Fatal编程技术网

C++ 两个不同的插槽调用相同的方法-线程安全

C++ 两个不同的插槽调用相同的方法-线程安全,c++,multithreading,qt,C++,Multithreading,Qt,我对编程比较陌生,尤其是Qt。我正在编写一个应用程序,它使用两个不同的线程(secThread和minThread)计算分钟和秒数。当分钟/秒应该增加时,两个线程都会向gui发送一个信号 信号和插槽在gui类中的连接方式如下: connect(secThread, SIGNAL(increment()), this, SLOT(incrementSeconds())); connect(minThread, SIGNAL(increment()), this, SLOT(incrementMin

我对编程比较陌生,尤其是Qt。我正在编写一个应用程序,它使用两个不同的线程(secThread和minThread)计算分钟和秒数。当分钟/秒应该增加时,两个线程都会向gui发送一个信号

信号和插槽在gui类中的连接方式如下:

connect(secThread, SIGNAL(increment()), this, SLOT(incrementSeconds()));
connect(minThread, SIGNAL(increment()), this, SLOT(incrementMinutes()));
void ClockGUI::incrementMinutes(){
  minutes++;
  if(minutes==60) minutes=0;
  updateDisplay();
}


void ClockGUI::incrementSeconds(){
  seconds++;
  if(seconds==60) seconds=0;
  updateDisplay();
}
插槽的实现方式如下:

connect(secThread, SIGNAL(increment()), this, SLOT(incrementSeconds()));
connect(minThread, SIGNAL(increment()), this, SLOT(incrementMinutes()));
void ClockGUI::incrementMinutes(){
  minutes++;
  if(minutes==60) minutes=0;
  updateDisplay();
}


void ClockGUI::incrementSeconds(){
  seconds++;
  if(seconds==60) seconds=0;
  updateDisplay();
}
如您所见,两个插槽都调用私有updateDisplay()方法:


据我所知,从不同线程调用同一个插槽是线程安全的,但我的问题是:从两个不同的插槽中调用相同的方法是否线程安全?

该插槽将在您的ClockGUI线程中执行,因此,这两个功能永远不会同时执行

您在将信号连接到接收器插槽(此为ClockGUI*)时,按照文档使用默认的
Qt::AutoConnection

参见it的定义:

Qt::自动连接0(默认值)如果接收器位于发出信号的线程中,则使用Qt::DirectConnection。否则,将使用Qt::QueuedConnection。连接类型在发出信号时确定

Qt::DirectConnection 1在发出信号时立即调用插槽。插槽在信令线程中执行

QueuedConnection 2当控件返回到接收方线程的事件循环时,将调用该插槽。插槽在接收器的线程中执行

这意味着,接收方线程将按照线程中的(按时间顺序)发射顺序,按照
Qt::QueuedConnection
执行这些插槽函数,但顺序在您的情况下可能并不重要。也就是说,无论哪个线程更早到达信号发射

在这方面,Qt事件循环基本上基于FIFO(先进先出)


除此之外,我不确定您在这里所说的线程安全是什么意思。

在这个场景中,您所说的线程安全是什么意思?而且,用例也不太清楚。为什么要使用线程来测量时间?既然updateDisplay()方法同时更新秒和分钟的显示,我想知道理论上这两个线程是否可以同时修改这些属性,因为有两个不同的插槽调用此方法。(是的,我同意使用线程来测量时间是过分的,但这是一个学校作业,需要使用线程)谢谢你的回答。所以,所有插槽都有一个队列,而不是每个插槽一个队列?是的,每个插槽的查询有什么意义?那将不再是一个队列,是吗?:)