Qt如何实现线程同步
发表于:2024-12-13 作者:千家信息网编辑
千家信息网最后更新 2024年12月13日,本篇内容介绍了"Qt如何实现线程同步"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题的提出线程安全
千家信息网最后更新 2024年12月13日Qt如何实现线程同步
本篇内容介绍了"Qt如何实现线程同步"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
问题的提出
线程安全的数据类可以提供一种便利的手段来进行线程之间的数据交换,但是这种方法并没有协调两个线程的动作,这一点从输出结果也可以看出:
从输出可以看出,数据交换要么成功,要么就根本不能进行。这就是线程间没有同步的结果。解决这个问题就需要线程同步处理。
示例代码
本例中定义两个互斥量,dataReady和bufferReady。
void WriteData(int i,
QMutex& dataReady,
QMutex& bufferReady)
{
bufferReady.lock();
cout << "WT:<<< i << "<<<<" << endl;
int buffer[5];
for(int j = 0; j < 5; ++j)
{
buffer[j] = j;
}
data_array.setData(buffer, 5);
dataReady.unlock();
}
WriteData方法首先尝试对bufferReady加锁,如果数据类中没有数据时,加锁操作成功,接下来按照正常逻辑写入数据,最后dataReady解锁,为ReadData创造执行条件。
void ReadData(int i,
QMutex& dataReady,
QMutex& bufferReady)
{
dataReady.lock();
cout << "RT:>>>>ReadData:" <<
i << ">>>>" << endl;
int buffer[5];
int data_size =
data_array.removeData(buffer, 5);
cout << "RT::----data_size=" <<
data_size << endl;
int total = 0;
for(int k = 0; k < data_size; ++k)
{
total += buffer[k];
}
cout << "RT:----total=" <<
total << endl;
bufferReady.unlock();
}
ReadData方法首先尝试对dataReady加锁,如果数据类中存在数据时,加锁操作成功,接下来按照正常逻辑读出数据,最后对bufferReady解锁,为WriteData创造执行条件。
int main(int /*argc*/, char*[] /*argv*/)
{
//define CreateDataTask class.
class CreateDataTask : public QThread
{
QMutex& m_data;
QMutex& m_buffer;
public:
CreateDataTask(QMutex& dataReady,
QMutex& bufferReady)
:m_data(dataReady)
,m_buffer(bufferReady)
{
}
private:
void run()
{
for(int i = 0; i < 10; ++i)
{
WriteData(i, m_data, m_buffer);
}
}
};
QMutex dataReady;
QMutex bufferReady;
::timeBeginPeriod(1);
dataReady.lock();
//Create thread object of CreateDataTask.
CreateDataTask *writer =
new CreateDataTask(dataReady,
bufferReady);
//Start Thread.
writer->start(QThread::NormalPriority);
for(int i = 0; i < 10; ++i)
{
ReadData(i, dataReady, bufferReady);
}
timeEndPeriod(1);
getch();
return 0;
}
Main函数中创建了两个互斥量,dataReady和bufferReady,用于读数据操作和和写数据操作。
由于最初没有写入的数据,所以首先调用dataReaday.lock操作,使读数据线程处于阻塞状态。
CreateDataTask类没有另外创建互斥量,而是使用构造函数传递的两个互斥量,然后再传递给WriteData函数。
执行结果
写数据操作,读数据操作整齐地间隔排列,同时数据传递全部正确!
"Qt如何实现线程同步"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
数据
线程
同步
两个
成功
接下来
函数
方法
结果
输出
内容
更多
条件
知识
要么
逻辑
问题
尝试
实用
安全
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
重庆生鲜app软件开发
护苗网络安全课视频++简报
以管理员身份运行数据库会闪退吗
数据库论坛二维表
大冲关网络安全知识
软件开发者是干什么的
软件开发新员工评语
通过m ysql创建数据库
无限法则怎么自动连接服务器
服务器百万并发量
网络安全技术与实训参考文献
香港服务器服务商
六一儿童网络安全
简述数据库备份和恢复的含义
安波福连接器软件开发
中国网络安全法+上网日志
在服务器上组建nsa
广西管理系统软件开发商
美电贝尔服务器尺寸大小
esp8266 软件开发
添加网址为数据库
校招网络技术面试自我介绍
数据运维网络安全委员会
新疆电信服务器
用友软件应用服务器安装图文教程
以下针对数据库安全
万方数据库怎样进入
网络安全可以研发什么产品
网络安全小知识有奖竞答
部队手机网络安全讨论题