C++11 多线程开发
文章平均质量分 57
华枝歌
这个人很神秘,他好像什么都会~
展开
-
关于std::future成员函数wait_for()
一、关于std::future成员函数wait_for():1.1 关于std::future_status:std::future_status是一个枚举类型,其值有三:// ENUM future_statusenum class future_status { // names for timed wait function returns ready, timeout, deferred//延迟执行,当std::async()第一个参数为std::lanuch::de原创 2022-03-11 00:29:39 · 5752 阅读 · 0 评论 -
单例设计模式和多线程
一、设计模式杂谈:在特别大的项目中,把项目的开发经验、模块划分经验,总结整理成设计模式程序灵活,维护起来可能方便,但是用设计模式理念写出来的代码晦涩难理解。设计模式有其独特的优点,要活学活用,不要深陷其中,生搬硬套二、单例设计模式:整个项目中,有某个或者某些特殊的类,只能创建一个属于该类的对象。单例类:只能生成一个对象。class MyCAS{private: MyCAS() {};private: static MyCAS* m_instance;public: sta原创 2022-03-11 00:29:53 · 168 阅读 · 0 评论 -
unique_lock()使用
一、unique_lock():是一个类模板,可以取代lock_guard(),相比起来前者更灵活,但效率较差,内存占用较多 ,一般工作中推荐使用lock_guard()。二、unique_lock()的第二个参数:2.1 std::adopt_lock:表示互斥量已经被lock,则在第二个参数添加此标志。(使用此参数则当前线程之前未使用lock())。 my_mutex1.lock(); std::lock_guard<std::mutex>myLockGuard(my_mutex1原创 2022-03-11 00:30:10 · 2227 阅读 · 0 评论 -
互斥量基本概念
一、互斥量(mutex)的基本概念互斥量就是个类对象,可以理解为一把锁,多个线程尝试用lock()成员函数来加锁,只有一个线程能锁定成功,如果没有锁成功,那么流程将卡在lock()这里不断尝试去锁定。互斥量使用要小心,保护数据不多也不少,少了达不到效果,多了影响效率。二、互斥量的用法2.1 lock(),unlock()添加头文件:#include<mutex>声明与创建:std::mutex my_mutex;先lock()—>操作共享数据—>unlock()原创 2022-03-10 00:26:32 · 2034 阅读 · 0 评论 -
关于线程参数
一、传递临时对象作为线程参数1.1要避免的陷阱1:void myPrint(const int &i, char* pmybuf){ //如果线程从主线程detach了 //i不是mvar真正的引用,实际上值传递,即使主线程运行完毕了,子线程用i仍然是安全的,但仍不推荐传递引用 //推荐改为const int i cout << i << endl; //pmybuf还是指向原来的字符串,所以这么写是不安全的 cout << pmybuf <原创 2022-03-10 00:26:06 · 535 阅读 · 0 评论 -
async和package_task和promise
一、std::async、std::future:std::async是一个函数模板,用来启动一个异步任务,它返回一个std::future对象,这个对象是个类模板。这个std::future对象中就含有线程入口函数所返回的结果,我们可以通过调用future对象的成员函数get()来获取结果。二、std::future的get()与wait():get()成员函数会等待线程执行结束 返回结果,拿不到结果它就会一直等待。get()只能调用一次。std::future对象的wait()成员函数原创 2022-03-10 00:25:26 · 430 阅读 · 2 评论 -
Windows临界区
一、windows临界区Windows临界区:(使用前必须初始化)//创建: CRITICAL_SECTION my_winsec;//创建windows中的临界区,类似与互斥量,使用前必须初始化//初始化:(通常在类构造函数中初始化) InitializeCriticalSection(&my_winsec);//初始化临界区//临界区使用: EnterCriticalSection(&my_winsec);//进入临界区(加锁) myQueue.push_back(i原创 2022-03-10 00:24:32 · 1347 阅读 · 0 评论 -
条件变量相关
一、条件变量condition_variable:std::condition_variable实际上是一个类,是一个和条件相关的类,条件达成与否决定该类对象的值。std::condition_variable my_cond;//生成一个条件变量对象二、wait()与notify_one()函数的搭配使用:wait()函数使用:wait()决定线程是否阻塞,其第二个参数默认为false。当第二个参数为true时,wait()直接返回并此线程继续执行。当第二个参数的值为false()时,w原创 2022-03-10 00:22:38 · 106 阅读 · 0 评论 -
原子操作和是std::async深入理解
一、原子操作std::atomic续谈:一般原子操作针对:++、–、+=、|=、^=支持,其他可能不支持。 g_count++;//OK g_count += 1;//OK //g_count = g_count + 1;ERROR二、std::async深入理解:2.1 两个参数:延迟调用参数 std::launch::deferred【延迟调用】std::launch::async【强制创建一个线程】std::async和std::thread最明显的不同,就是 std:原创 2022-03-10 00:21:43 · 150 阅读 · 0 评论 -
虚假唤醒和原子操作
一、虚假唤醒:notify_one()或者notify_all()唤醒wait()后,实际有些线程可能不满足唤醒的条件:例如使用 notify_one() 两个线程在启动时的第一次唤醒,例如在使用 notify_all() 时多个线程都被唤醒共享区却只有满意少数线程操作,这时就会造成其他线程被虚假唤醒,可以在wait中再次进行判断解决虚假唤醒。解决:wait中要有第二个参数(lambda),并且这个lambda中要正确判断所处理的公共数据是否存在。例如:(通过lambda进行判断防止虚假唤醒) my原创 2022-03-10 00:20:56 · 257 阅读 · 0 评论 -
创建和等待多个线程
一、创建和等待多个线程多个线程执行顺序是乱的,跟内部操作系统的运行调度机制有关;推荐使用join()方法使主线程等待所有子线程执行结束后,主线程再结束,这样的程序更稳定。将每次创建的thread对象放入vector容器中,这样可以一次创建大量线程进行管理vector<thread>mythread; for (int i = 0; i < 10; i++) { mythread.push_back(thread(myprint, i));//创建并开始执行线程 }原创 2022-03-10 00:19:47 · 692 阅读 · 0 评论