一、并发和并行

1、并行(parallel)

指在同一时刻,有多条指令在多个处理器上同时执行。就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。所以无论从微观还是从宏观来看,二者都是一起执行的。

2、并发(concurrency)

指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。

并行在多处理器系统中存在,而并发可以在单处理器和多处理器系统中都存在,并发能够在单处理器系统中存在是因为并发是并行的假象,并行要求程序能够同时执行多个操作,而并发只是要求程序假装同时执行多个操作(每个小时间片执行一个操作,多个操作快速切换执行)。

当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态.这种方式我们称之为并发(Concurrent)。

当系统有一个以上CPU时,则线程的操作有可能非并发.当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。


二、多线程

Linux下调用多线程有两种方式,一种是利用POSIX线程库<pthread.h>,一种是用C++11中的线程类<thread>,本文用的是后者。其中,Linux下用C++11创建多线程分为可连接的和不可连接的。

可连接线程:需要调用thread成员函数thread::join()阻塞等待线程结束并且回收资源;thread默认创建的线程是可连接线程!

不可连接线程(也就是分离线程):直接调用thread::detach()即可在线程结束后自动回收资源。

函数pthread_exit(NULL)(放在主函数里面)表示主线程结束后,该线程所在进程并不会立即结束,要等所有线程结束后主进程才会结束。

下面将分别列举可连接线程和分离线程实例。

实例1

创建一个可连接线程,并传入字符串

步骤1:在Linux目录下新建一个文件名为thread_input_char.cpp空白文件,输入下列代码:

#include <iostream>
#include <thread>
using namespace std;void thfunc(char *s)
{cout<<"child thread char =="<< s << "\n";  //打印传入的字符串
}int main(int argc, char *argv[])
{char s[] = "I am a main thread char";thread t(thfunc,s);    //创建线程,传入线程函数,带字符串t.join();return 0;
}

步骤2:在终端terminal输入下列命令,生成可执行程序thread_input_char,然后运行可执行程序,结果如下图所示:

g++ -o thread_input_char thread_input_char.cpp -lpthread -std=c++11

实例2

创建一个分离线程,并且传入结构体和多个变量

步骤1:在Linux目录下新建一个文件名为thread_input_struct.cpp空白文件,输入下列代码:

#include <iostream>
#include <thread>
using namespace std;typedef struct  //
{int num;const char *str;   //z
}MYSTRUCT;void thfunc(void *arg, int m, int *k, char s[])
{MYSTRUCT *p = (MYSTRUCT*)arg; //cout<<"child thread p->num =="<< p->num <<"\nchild thread p->str =="<< p->str<<endl;    //dcout<<"child thread m =="<<m<<"\nchild thread k =="<<*k<<"\nchild thread str =="<<s<<endl; //*k=7777;
}int main(int argc, char *argv[])
{MYSTRUCT mystruct; //dmystruct.num = 666;mystruct.str =  "I am a struct";int m=300,k=12;char str[]="I am a string";   thread t(thfunc,&mystruct,m,&k,str);    //st.detach();  //cout<<"changed value k =="<<k<<endl;    //7777pthread_exit(NULL);   //cout<<"I can not run!"<<endl;return 0;
}

步骤2:在终端terminal输入下列命令,生成可执行程序thread_input_char,然后运行可执行程序,结果如下图所示:

g++ -o thread_input_struct thread_input_struct.cpp -lpthread -std=c++11

三、线程锁

为了防止线程竞争同一个资源,比如同时读写某个变量导致错误,引入了互斥锁的概念<mutex>

std::mutex mlock;static int count = 0;
std::thread::id id = std::this_thread::get_id();
cout << "this thread id is " << id << endl;
mlock.lock();for (int i = 0; i < 300000; ++i)count++;
cout << "count = " << count << endl;//300000时count出现不是300000倍数的情况,//说明多线程在访问count的时候有问题了,加锁就OK!
mlock.unlock();

Linux C++11——多线程类thread相关推荐

  1. C++11多线程,thread库; mutex类,成员函数lock(), unlock();unique_lock<mutex>模板类

    文章目录 进程和线程 1. 进程 2. 线程 C++11多线程编程 1. C++11新标准 2. 创建线程 1. 普通函数 2. 仿函数 3. 成员函数 4. 多线程数据保护(数据一致性) 进程和线程 ...

  2. C++11多线程:thread头文件

    目录 1. std::thread(class) 线程构造(constructor) joinable 线程状态 operator= join detach get_id native_handle ...

  3. C++多线程:thread类创建线程的多种方式

    文章目录 描述 函数成员简介 总结 描述 头文件 <thread> 声明方式:std::thread <obj> 简介 线程在构造关联的线程对象时立即开始执行,从提供给作为构造 ...

  4. C++11 多线程相关知识的学习

    C++多线程类Thread(C++11) C++11中std命名空间将Boost库中的Thread加入,Boost的多线程从准标准变为标准,这里将其用法整理复习,以demo的形式复习,还是喜欢看我自己 ...

  5. PHP多线程的实现(PHP多线程类)

    通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...

  6. java 线程 基类_关于Linux 系统下 C++ 的多线程基类 Thread

    最近在Linux 下用C++做的东西,原来是使用"多进程"方式实现,现在随着工程的增大,"多进程"的"变量共享"问题已经十分突出了,虽然可以 ...

  7. Linux与C++11多线程编程(学习笔记)

    多线程编程与资源同步 在Windows下,主线程退出后,子线程也会被关闭; 在Linux下,主线程退出后,系统不会关闭子线程,这样就产生了僵尸进程 3.2.1创建线程 Linux 线程的创建 #inc ...

  8. [C++] - C++11 多线程 - Thread

    转载整理自:https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/tree/master/zh/chapter3-Thread 1 ...

  9. C++11并发编程:多线程std::thread

    一:概述 C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改.现在在C++11中只需使用语 ...

最新文章

  1. iOS 关于pods-frameworks.sh:permission denied报错的解决
  2. centos6.5环境wget报错Unable to establish SSL connection
  3. linux下随机数字的生成
  4. thinkPHP开发基础知识 包括变量神马的
  5. 用代码,打造创意新世界!【Innovation 2021】网易应用创新开发者大赛正式开赛!
  6. Linux认证复习题100道含答案
  7. mysql求和语句大全_sql查询语句大全
  8. #if _MSC_VER 1000 #pragma once #endif
  9. 使用SharedPreference保存用户数据的步骤
  10. Html中代码换行造成空格间距的问题
  11. latex 混淆矩阵
  12. 【干货】大数据招聘官就业指导
  13. 2011年,痛并快乐着
  14. 咖说 | 写给女朋友的 DeFi 笔记:半天 2 亿美元的 BarnBridge是什么?
  15. CC++笔面试知识点
  16. 如何给pdf添加水印?
  17. arduino-超声波测距
  18. Docker初级学习指南
  19. 通过蚂蚁开放联盟链快速上链
  20. 如何理解充分条件和必要条件

热门文章

  1. 「CSDN年度征文」微软学生大使、VSC中文社区、KDD CUP...2020年,我与技术社区
  2. index.php上传到服务器找不到站点,ThinkPHP上传到服务器出现404,未找到index.php模板等问题...
  3. lisp 设计盘形齿轮铣刀_齿轮是怎么来的——图解6种齿轮加工工艺
  4. php变量和js变量的区别吗,JS声明变量的3种方式和区别
  5. linux运行查依赖,linux运行命令缺少依赖库的查找方法
  6. java输入验证码代码,JavaWeb 实现验证码功能(demo)
  7. Whitelabel Error Page : spring boot项目启动后,无法访问@RequestMapping标注的请求
  8. [荐] 微信小程序模板源码合集
  9. Cocos2d-x动作CCAction
  10. 以用户为中心的SNS站点数据库设计及实现