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函数只被一个线程调用。谢谢 展开
#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函数只被一个线程调用。谢谢 展开
1个回答
展开全部
主界面有两个按钮,点击“开始”按钮,触发一个信号,然后子线程打印一条信息,点击“结束”按钮,关闭线程
线程相关类定义如下
线程类变量定义如下
线程启动、信号槽及实现如下。在构造函数中通过thread.start()启动线程。
运行程序,并查看程序输出。点击一下“开始”按钮,会触发线程打印一条日志,再点击一下“开始”按钮,线程再次打印一条日志。点击“结束”按钮,打印线程结束。这时再点击“开始”按钮,线程将不再打印日志
修改线程打印函数为一个for循环,并在每次循环后sleep(5)秒
运行程序,然后点击“开始”按钮,线程开始打印日志。打印一两条后点击“结束”按钮,程序并没有停止打印日志,而是等到for循环结束后,才打印线程结束的日志。这说明线程并没有结束
修改线程结束函数如下,使用terminal函数。再次执行相同的步骤。
线程可以正常退出,但是程序关闭时崩溃。
修改线程打印函数,增加flag标识,在线程退出时,修改该flag标识,达到for循环退出的效果。这样线程可以正常退出,而且程序关闭时也不会崩溃
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询