Linux C++11——多线程类thread
一、并发和并行
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相关推荐
- C++11多线程,thread库; mutex类,成员函数lock(), unlock();unique_lock<mutex>模板类
文章目录 进程和线程 1. 进程 2. 线程 C++11多线程编程 1. C++11新标准 2. 创建线程 1. 普通函数 2. 仿函数 3. 成员函数 4. 多线程数据保护(数据一致性) 进程和线程 ...
- C++11多线程:thread头文件
目录 1. std::thread(class) 线程构造(constructor) joinable 线程状态 operator= join detach get_id native_handle ...
- C++多线程:thread类创建线程的多种方式
文章目录 描述 函数成员简介 总结 描述 头文件 <thread> 声明方式:std::thread <obj> 简介 线程在构造关联的线程对象时立即开始执行,从提供给作为构造 ...
- C++11 多线程相关知识的学习
C++多线程类Thread(C++11) C++11中std命名空间将Boost库中的Thread加入,Boost的多线程从准标准变为标准,这里将其用法整理复习,以demo的形式复习,还是喜欢看我自己 ...
- PHP多线程的实现(PHP多线程类)
通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...
- java 线程 基类_关于Linux 系统下 C++ 的多线程基类 Thread
最近在Linux 下用C++做的东西,原来是使用"多进程"方式实现,现在随着工程的增大,"多进程"的"变量共享"问题已经十分突出了,虽然可以 ...
- Linux与C++11多线程编程(学习笔记)
多线程编程与资源同步 在Windows下,主线程退出后,子线程也会被关闭; 在Linux下,主线程退出后,系统不会关闭子线程,这样就产生了僵尸进程 3.2.1创建线程 Linux 线程的创建 #inc ...
- [C++] - C++11 多线程 - Thread
转载整理自:https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/tree/master/zh/chapter3-Thread 1 ...
- C++11并发编程:多线程std::thread
一:概述 C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改.现在在C++11中只需使用语 ...
最新文章
- iOS 关于pods-frameworks.sh:permission denied报错的解决
- centos6.5环境wget报错Unable to establish SSL connection
- linux下随机数字的生成
- thinkPHP开发基础知识 包括变量神马的
- 用代码,打造创意新世界!【Innovation 2021】网易应用创新开发者大赛正式开赛!
- Linux认证复习题100道含答案
- mysql求和语句大全_sql查询语句大全
- #if _MSC_VER 1000 #pragma once #endif
- 使用SharedPreference保存用户数据的步骤
- Html中代码换行造成空格间距的问题
- latex 混淆矩阵
- 【干货】大数据招聘官就业指导
- 2011年,痛并快乐着
- 咖说 | 写给女朋友的 DeFi 笔记:半天 2 亿美元的 BarnBridge是什么?
- CC++笔面试知识点
- 如何给pdf添加水印?
- arduino-超声波测距
- Docker初级学习指南
- 通过蚂蚁开放联盟链快速上链
- 如何理解充分条件和必要条件
热门文章
- 「CSDN年度征文」微软学生大使、VSC中文社区、KDD CUP...2020年,我与技术社区
- index.php上传到服务器找不到站点,ThinkPHP上传到服务器出现404,未找到index.php模板等问题...
- lisp 设计盘形齿轮铣刀_齿轮是怎么来的——图解6种齿轮加工工艺
- php变量和js变量的区别吗,JS声明变量的3种方式和区别
- linux运行查依赖,linux运行命令缺少依赖库的查找方法
- java输入验证码代码,JavaWeb 实现验证码功能(demo)
- Whitelabel Error Page : spring boot项目启动后,无法访问@RequestMapping标注的请求
- [荐] 微信小程序模板源码合集
- Cocos2d-x动作CCAction
- 以用户为中心的SNS站点数据库设计及实现