C++多线程基础学习笔记(一)】的更多相关文章

一.创建多个子线程 前面三章讲的例子都是只有一个子线程和主线程,然而实际中有多个子线程.那么下面介绍如何创建多个子线程. #include <iostream> #include <vector> #include <list> #include <thread> using namespace std; void mythread(int i) { cout << "id为" << std::this_threa…
下面分三个方面多线程技术的必须掌握一些基本知识. 1.进程 2.线程 3.并发 (1)进程 一个可执行程序运行起来了,即为创建了一个进程.如在电脑上打开了word,就创建了一个word进程,打开QQ,又创建了一个QQ进程. 可以在任务管理器中----->用户中查看进程. 不同的进程之间的通信方式有:管道.消息队列.共享内存.信号量(同一台电脑),socket(支持不同电脑). (2)线程 1.线程可理解成一条代码执行的通道 2.线程与进程之间的关系: 同一个进程允许有多个线程: 同一个进程的每个…
一.Windows临界区的基本用法 CRITICAL_SECTION my_winsc;              //定义一个Windows的临界区,相当于一个mutex变量 InitializeCriticalSection(&my_winsc);        //初始化 EnterCriticalSection(&my_winsc);            //进入临界区,相当于lock() LeaveCriticalSection(&my_winsc);         …
一.std::atomic续谈 上一章说到std::atomic是针对一个变量的,这里补充一下针对的变量操作一般是++,+=,--,&=等等运算 .以下这种不可取:a=a+1; 二.std::async与std::std::thread的区别 1.std::async第一个参数为std::lauch::async时,会强制创建一个线程,更确切来说,是创建一个异步任务,而std::thread有时会由于资源紧张,创建线程失败,从而导致程序报异常崩溃. 2.std::saync第二个参数为std::…
shared_futrue和futrue_status的用法 shared_futrue是一个类模板,类似于futrue,不同的是它的成员函数get()可以使用多次,因为是复制数据,而futrue的get()则是转移数据,使用一次之后,就失效了. futrue_status是一个枚举类型,用来判断某个线程是否在规定时间执行完. #include <iostream> #include <future> #include <Windows.h> using namespa…
一.std::async和std::future的用法 std::async是一个函数模板,std::future是一个类模板 #include <iostream> #include <thread> #include <future> #include <Windows.h> using namespace std; int mythread() { cout << "my thread:" << std::t…
condition_variable.wait.notifiy_one.notify_all的使用方式 condition_variable:条件变量 wait:等待被唤醒 notify_one:随机唤醒一个线程 notify_all:唤醒所有线程 下列代码是三个线程轮流打印数字 #include <iostream> #include <thread> #include <mutex> using namespace std; class print { privat…
一.互斥量 1.1 互斥量的基本概念 简单来说,一个锁就是一个互斥量,既然是锁,就有两种状态:加锁和解锁,通过加锁>>>操作共享数据>>>解锁的方式,实现保护共享数据. 1.2 互斥量的用法 作用:在给某段代码加锁后,如果其他其他线程需要先等带该段代码执行完,然后解锁后才能继续执行. 头文件 :#include <mutex> 成员函数:lock()   //加锁,unlock()  //解锁 注意点:lock()与unlock()的使用必须成对存在. #i…
一.detach()大坑 上一篇随笔(二)中提到detach()是用来分离主线程和子线程的,那么需要考虑一个问题,就是如果主线程跑完了,主线程中定义的变量就会被销毁(释放内存),这时回收变量仍作为参数传入子线程,那么就会出现问题,下面用一个例子详细说明. #include <iostream> #include <string> #include <thread> using namespace std; void MyThread(const int& a,…
先总结延申以下前面(一)所讲的内容. 主线程从main()函数开始执行,我们创建的线程也需要一个函数作为入口开始执行,所以第一步先初始化函数. 整个进程是否执行完毕的标志是主线程是否执行完毕,一般情况下,如果想要保持子线程的运行状态,那么要主线程保持运行. 本章从两方面介绍创建线程的方法: 一.用函数创建线程: 关键词:thread(类),join() ,detach(),joinable(). join(),阻塞主线程,等待子线程执行完毕后,才到主线程执行. detach(),分离主线程,主线…