qt多线程调用函数问题

请教各位高手帮我看一下这段多线程排队的代码有什么问题,大多数的时间都能正常工作,偶尔会出问题#defineMAX_ACCESS_DEVICE_OBJECT6typedef... 请教各位高手帮我看一下这段多线程排队的代码有什么问题,大多数的时间都能正常工作,偶尔会出问题
#define MAX_ACCESS_DEVICE_OBJECT 6
typedef struct QUEUE_ACCESS_DEVICE
{
QUEUE_ACCESS_DEVICE()
{
iCurrentPos = 0;
iObject = 0;

}
volatile int iCurrentPos;
volatile int iObject;
QMutex m_muOut;
QMutex muQueueNode[MAX_ACCESS_DEVICE_OBJECT ];

void Add()
{
int ipos = ConvertPos(iCurrentPos+ iObject);////循环移动位置下标
int iposNext = ConvertPos(ipos + 1);
iObject++;

muQueueNode[iposNext].lock();
muQueueNode[ipos].lock();
}
void Out()
{
Q_ASSERT(m_muOut.tryLock());
int iPos = ConvertPos(iCurrentPos);
int iPosNext = ConvertPos(iPos + 1);
iCurrentPos++;
iCurrentPos = ConvertPos(iCurrentPos);
iObject--;

muQueueNode[iPos].unlock();
muQueueNode[iPosNext].unlock();
m_muOut.unlock();

}
int ConvertPos(int iPos)
{
if (iPos>(MAX_ACCESS_DEVICE_OBJECT-1))
{
iPos = 0;
}
return iPos;
}
}QUEUE_ACCESS_DEVICE;
这个结构会在另外一个访问设备的类里面定义一个对象,供给多个线程调用访问设备的函数排队,大概如下
QUEUE_ACCESS_DEVICE qae;
某个线程要访问设备时候先调用
qae.add();
然后这个设备如果正在被调用那add这个函数就会阻塞起来直到上一个线程访问完毕设备以后调用qae.out();
问题就出在out这个函数里面,在执行到unlock之前比如说ipos等于1,那当执行到unlock的时候ipos就等于4了,调试了几次ipos变化的值都比原先赋的值多2,兄弟才疏学浅看不出ipos是在哪里被修改了,请各位高手看一看谢谢,我确定任意时刻out函数只被一个线程调用。谢谢
展开
 我来答
姣过手飘找人1Q
2018-05-14 · TA获得超过1904个赞
知道大有可为答主
回答量:2466
采纳率:70%
帮助的人:364万
展开全部
  • 主界面有两个按钮,点击“开始”按钮,触发一个信号,然后子线程打印一条信息,点击“结束”按钮,关闭线程

  • 线程相关类定义如下

  • 线程类变量定义如下

  • 线程启动、信号槽及实现如下。在构造函数中通过thread.start()启动线程。

  • 运行程序,并查看程序输出。点击一下“开始”按钮,会触发线程打印一条日志,再点击一下“开始”按钮,线程再次打印一条日志。点击“结束”按钮,打印线程结束。这时再点击“开始”按钮,线程将不再打印日志

  • 修改线程打印函数为一个for循环,并在每次循环后sleep(5)秒

  • 运行程序,然后点击“开始”按钮,线程开始打印日志。打印一两条后点击“结束”按钮,程序并没有停止打印日志,而是等到for循环结束后,才打印线程结束的日志。这说明线程并没有结束

  • 修改线程结束函数如下,使用terminal函数。再次执行相同的步骤。

    线程可以正常退出,但是程序关闭时崩溃。

  • 修改线程打印函数,增加flag标识,在线程退出时,修改该flag标识,达到for循环退出的效果。这样线程可以正常退出,而且程序关闭时也不会崩溃

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式