月付商城网站建站,seo能干一辈子吗,网站开发实现页面的跳转,天津哪家公司做企业网站编译环境#xff1a;Qt join#xff1a;阻塞当前线程#xff0c;直到线程函数退出 detach#xff1a;将线程对象与线程函数分离#xff0c;线程不依赖线程对象管理 注#xff1a;join和detach两者必选其一#xff0c;否则线程对象的回收会影响线程的回收#xff0c;导致…编译环境Qt join阻塞当前线程直到线程函数退出 detach将线程对象与线程函数分离线程不依赖线程对象管理 注join和detach两者必选其一否则线程对象的回收会影响线程的回收导致程序崩溃 思考执行detach之后的线程如何退出
方法设置标志位
#include dialog.h
#includeiostream
using namespace std;
#include QDebug
#includethread#include QApplicationint add(int a,int b)
{qDebug()add;qDebug()ab ab;_sleep(1000);return ab;
}class AA
{
public:AA(){//在构造函数中创建线程//如果使用_beginthreadex 线程函数是staticthread th(threadFun,this);th.detach();}//执行detach之后线程如何退出//设置标志位void threadFun(){while(!m_isQuit){_sleep(100);qDebug()do some work;}}
private:bool m_isQuit false;
};int main(int argc, char *argv[])
{QApplication a(argc, argv);{thread th(add,3,4);//线程函数可以以参数形式传入//join函数 阻塞当前线程 直到线程函数退出
// _sleep(100);
// qDebug()before join;
// th.join();
// qDebug()thread join;//detach 将线程对象与线程函数分离线程不依赖线程对象管理qDebug()before detach;th.detach();qDebug()after detach;//注join和detach两者必选其一否则线程对象的回收会影响线程的回收导致程序崩溃}Dialog w;w.show();return a.exec();
}看下面一段代码 执行结果不等于300为什么
g_value时分为三步读自增写。在多线程情况下可能存在多个线程读或写同一个值的情况这就使得结果小于我们预期的值了。
线程并发引发的数据问题 并发同一时间间隔内程序交替执行 解决线程同步 线程同步同一时间只允许一个线程访问资源 实现线程同步方法
互斥锁读写锁条件变量原子操作信号和槽事件循环
1、互斥锁 lock_guard 与 unique_lock 管理互斥锁让互斥锁使用更方便、更安全可以避免死锁比如我们使用完锁忘记释放了
lock_guard 与 unique_lock 遵循RAII
RAII资源获取即初始化是C很重要的思想。 思考如果需要在中途释放锁怎么办
使用 unique_lock使用 lock_guard 花括号实现即锁一部分 锁锁定代码长度称为粒度锁定的代码长度越长锁的粒度越大影响并发的效率。 2、条件变量 #includecondition_variable std::condition_variable con_var; con_var.notify_one();通知一个 con_var.notify_all();通知所有 con_var.wait(); wait() 函数 有两个参数第一个参数是一个已经上锁的互斥锁unique_lock第二个参数是一个可调用对象其中包含函数指针仿函数bind lambda表达式如果这个函数执行返回值是false 就会通知无效可以避免误通知作用阻塞当前线程直到收到通知 notify_one notify_all当调用wait时释放互斥锁阻塞当前线程将线程放入条件变量等待的容器中当收到通知时获取互斥锁执行后续代码wait()和通知的关系在使用的时候一定是wait之后才能收到通知否则会失效 运行结果
先打印出三个before wait之后每点击一下按钮打印一个after wait 举例 现在我们改变一下 运行结果
我们第一次按下按钮quit取非为真此时打印after wait再次按下此时quit取非为假此时无反应第三次按下此时quit又为真打印after wait......
3、原子操作 #includeatomic atomicint cnt(0); cnt; cnt--;cnt.load(); #include dialog.h#includeiostream
using namespace std;#include QDebug
#includethread
#include QApplication#includeatomic
atomicint cnt(0);void AutomicFunc()
{for(int i0;i100;i){_sleep(10);//cnt; //加锁的方式进行是原子操作线程安全cnt cnt 1; //非原子操作线程不安全_sleep(10);}
}int main(int argc, char *argv[])
{QApplication a(argc, argv);{thread th[3];for(int i0;i3;i){th[i] thread(AutomicFunc);}for(int i0;i3;i){th[i].join();}}qDebug()count cnt.load();//取值Dialog w;w.show();return a.exec();
}如有问题欢迎交流指正