1、CreateThread创建线程的过程如下:

C++多线程编程(真实入门!)_Kprogram的博客-CSDN博客_c++多线程编程

_beginthread()创建线程过程如下:

C++多线程——_beginthread()和_beginthreadex_xuanyin235的专栏-CSDN博客

/*************************************************************************************************************/

/******************C++11中添加了新的线程创建使用方法,常见的介绍如下***************************/

2、利用std::async异步线程创建过程见:c++11多线程编程(九):std::async介绍与实例_小麒麟的成长之路-CSDN博客_std::async

3、利用std::future获取异步线程执行结果的过程见:

c++11多线程编程(九):std::async介绍与实例_小麒麟的成长之路-CSDN博客_std::async

4、利用join函数创建线程,join线程的使用场景是:调用join的函数必须等待join的线程函数执行完成,才可以进行往下执行,否则阻塞调用join函数的线程,直到join线程执行完毕。

5、利用detach函数创建线程,detach使用场景:detach()函数会让线程在后台运行,即说明主线程不会等待子线程运行结束才结束。

上面join和detach创建线程的过程见:

C++11多线程join()和detach()的理解_Stone-CSDN博客_c++ join

C++11多线程thread参数传递问题_A_Bo的博客-CSDN博客_c++ thread 参数

join的用法demo如下:

#include <iostream>
#include <thread>
#include <stdio.h>
#include <vector>
#include <Windows.h>
void func() {for (int i = 0; i < 10; ++i) {char chIn[50];sprintf_s(chIn, 49, "thread::func is : %d", i); //sprintf_s(chIn, 49, "thread::func is : %d\n", i);OutputDebugStringA(chIn);//调试控制台打印结果std::cout << "thread::func"  << chIn << std::endl; //dos命令窗口打印}
}
int main(int argc, char *argv[])
{std::vector<std::thread> threads; //存储线程函数的变量for (int i = 0; i < 10; i++) {threads.push_back(std::thread(func));}for (auto &thread : threads) {thread.join();  //执行线程变量中的每个线程执行函数}std::thread myFun(func);myFun.join();return 0;
}

思考:若线程函数使用同一个vector类型的变量进行写操作,会出现资源写入冲突的问题,若使用map代替就不会出现,因为map的键只能唯一;当然,在vector写入的时候加入锁也是可以解决的,但是加锁,在线程处理结果不能立即返回的情况下,会影响性能。程序如下:

#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <map>
#include <Windows.h>
using namespace std;
std::vector<int> vecGa;std::map<int,int> mapGa;
std::mutex va1;
void fun1(int a)
{//std::lock_guard<std::mutex>lock(va1);  // 若不加锁,vector写入时会出现访问异常的问题//{// Sleep(100);//   std::cout << "iiiiiiiiiiiii " << a << std::endl;//  vecGa.push_back(a);//}Sleep(100);std::cout << "iiiiiiiiiiiii " << a << std::endl;mapGa.insert(pair<int,int>(a,a));
}
int main()
{std::vector<std::thread>vecTest;for (int i = 0; i < 100; i++){vecTest.push_back(std::thread(fun1,i));}for (auto &thread : vecTest){thread.join();}std::cout << "Hello World!\n";
}

注:多线程共享相同的变量时,存在两种情况:

(1)若线程间都是共同读取一个变量,即访问同一块地址,由于都不会改写该内存的数据,所以不会产生数据修改的竞争,不需要加锁。

(2)若线程间共同修改同一个变量,即修改同一块地址的数据,会出现数据修改的竞争问题,都要加锁。

如:

nNum = 0;   thread1:    { nNum =+2;}       thread2:{nNum=+5;}

当thread1运行到修改nNum++时,线程执行的碎片时间到,   thread2获取执行权,nNum值变        为5,这时thread1获取到执行权,这时,thread1里面的变量已经变为了5,执行++操作后,变        为7,这个预期是不相符的。为了保证数据执行的顺序按照预期,可以加锁。

局部变量的创建修改是不用加锁的,因为每个线程里面的局部变量地址是不一样的;公有变量的地址是一样的,所以修改公有变量时必须加锁

若是想安装交替执行可以使用条件变量std::condition_variable ,参考多线程mute/lock_guard/unique_lock/condition_variable访问同一公共资源_hanxiaoyong_的博客-CSDN博客

下面举一个例子

// MutTV.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <map>
#include <Windows.h>
using namespace std;
std::mutex va1;
int nNum = 0;
void fun1(int a)
{{std::lock_guard<std::mutex>lock(va1);Sleep(100);nNum += 2;std::cout << "iiiiiiiiiiiii " << nNum << std::endl;}
}
void fun2(int a)
{std::lock_guard<std::mutex>lock(va1);{Sleep(100);nNum += 5;std::cout << "jjjjjjjjjjjjjjjjj " << nNum << std::endl;}}
int main()
{std::vector<std::thread>vecTest;for (int i = 0; i < 100; i++){if (i < 50) {vecTest.push_back(std::thread(fun1, i));}else{vecTest.push_back(std::thread(fun2, i));}}for (auto &thread : vecTest){thread.join();}std::cout << "Hello World!\n";
}

加锁运行情况如下:

不加锁的运行如下:

thread的线程函数绑定类成员函数如下:

#include <thread>
class A
{void func1(int nValue){//todo}
};void main()
{A a;std::thread ths(&Task::func1, &a, 1);ths.detach();reutrn;
}

C++多线程编程(真实入门)相关推荐

  1. Delphi多线程编程基础入门

    1. 概述 对于开发人员来说,多线程是必备的知识,但相对来说,也是比较难的知识点.Delphi是一门古老而优秀的编程语言,它对多线程的处理有一些特殊的地方,本文尝试做一些简单的讲解,可以当作Delph ...

  2. C++多线程编程(入门实例)

    多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对多线程的理解程度从一个侧面反映了程序员的编程水平. 其实C++语言本身并没有提供多线程机制(当然目前C++ 11 ...

  3. java多线程编程从入门到卓越(超详细总结)

    导读:java多线程编程不太熟?或是听说过?或是想复习一下?找不到好的文章?别担心我给你们又安利一波,文章内容很全,并且考虑到很多开发中遇到的问题和解决方案.循环渐进,通俗易懂,文章较长,建议收藏再看 ...

  4. Windows下C++多线程编程(入门实例)

    多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对多线程的理解程度从一个侧面反映了程序员的编程水平. 其实C++语言本身并没有提供多线程机制(当然目前C++ 11 ...

  5. Linux下C++多线程编程(入门实例)

    C++ 多线程 多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序.一般情况下,两种类型的多任务处理:基于进程和基于线程. 基于进程的多任务处理是程序的并发执行. 基于 ...

  6. Qt多线程编程(一)入门篇

    目录 一.多线程是什么 二.为什么要使用多线程进行开发 1.提高处理效率 2.软件运行更加流畅 3.根据优先级依次处理 三.Qt多线程入门 QThread类,类成员及类成员函数介绍 公有变量 公有函数 ...

  7. .NET多线程编程入门

    在.NET多线程编程这个系列我们讲一起来探讨多线程编程的各个方面.首先我将在本篇文章的开始向大家介绍多线程的有关概念以及多线程编程的基础知识;在接下来的文章中,我将逐一讲述.NET平台上多线程编程的知 ...

  8. Linux系统下的多线程编程入门

    线程的数据处理 和进程相比,线程的最大优点之一是数据的共享性,各个进程共享父进程处沿袭的数据段,可以方便的获得.修改数据.但这也给多线程编程带来了许多问题.我们必须当心有多个不同的进程访问相同的变量. ...

  9. Python多线程编程(详细:适合小白入门)

    目录 前言 一.进程 1.多任务 2.进程 3.多进程完成多任务 3.1进程的创建步骤 3.2通过进程类创建进程对象 3.3创建进程和启动的代码 4. 进程执行带有参数的任务 5.获取进程编号 6.进 ...

  10. Delphi 多线程编程(1)

    本文的内容取自万一博客,并重新加以整理,在此留存仅仅是方便自己学习和查阅.所有代码均亲自测试 delphi7下测试有效.图片均为自己制作. 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过, ...

最新文章

  1. 视觉里程计的轨迹评估的工具:evo
  2. Flask | 浅读文档,快速出发
  3. 二值化图像的欧拉数_Android OpenCV(八):图像二值化
  4. 面向程序员的数据挖掘指南: 第二章 从推荐系统开始
  5. python3.7.3 离线安装paramiko_centos7 python3 安装paramiko模块
  6. go语言中的defer
  7. ubuntn开发php教程,Ubuntu16.04的PHP开发环境配置
  8. Android 源代码中的res
  9. [翻译] KGModal
  10. 2-06 使用网络存储SAN和NAS
  11. php func_get_args(),PHP中func_get_args(),func_get_arg(),func_num_args()有什么不同
  12. stata中计算公式命令_Stata:runby - 一切皆可分组计算!
  13. 小米笔记本linux无线网卡驱动,小米笔记本在Kali Linux下所遇问题部分解决方案
  14. Python pass语句及其作用
  15. ABP Vnext 扩展微信小程序授权登录
  16. 跨越13开启14--猿猿感想
  17. BarChart 柱状图 实例
  18. crsctl命令详解(原创)
  19. 用户故事地图编写方法
  20. midi java_java midi音乐文件播放器

热门文章

  1. 按顺序发起多次请求的loading使用
  2. 什么是deployment 声明式升级应用
  3. .php on line 0,windows启动apache提示PHP Startup: in Unknown on line 0
  4. batocera 完整包_Batocera Plus 可能是现如今最强最全最好用的模拟器集成系统!
  5. 高德地图车机版缩放版_高德地图车机版2020
  6. 电子计算机与多谋种,计算机国二MS_Office高级应用
  7. 充一次电使用一年的手机_手机充一次电用一年?现有技术难实现
  8. mongodb 分组聚合_MongoDB 临时表横空出现 1 万+,这条语句执行前请准备好翻车的姿势...
  9. html文件文本预处理,HTML文件文本信息预处理技术.pdf
  10. openGL ES 教程(二):渲染管线