mutex,thread(c++11 windows linux三种方式)
一 c++11 windows linux三种方式
//#include <stdio.h>
//#include <stdlib.h>
//#include <unistd.h>
#include <windows.h>
//#include <pthread.h>
#include <mutex>
#include <thread>
#include <string.h>
using namespace std;
char* buf[5]; //字符指针数组  全局变量
int pos; //用于指定上面数组的下标
//1.定义互斥量
//pthread_mutex_t mutex;  // linux
mutex mtx;	// C++11
HANDLE g_hMutex = INVALID_HANDLE_VALUE;  // Win
void *task(void *p)
{
	//3.使用互斥量进行加锁
	//pthread_mutex_lock(&mutex);  // linux
	//mtx.lock();	// C++11
	WaitForSingleObject(g_hMutex, INFINITE);//等待互斥量 Win
	buf[pos] = (char *)p;
	printf("task %d\r\n", pos);
	//sleep(1);   // linux
	Sleep(500);	  // Win
	pos++;
	//4.使用互斥量进行解锁
	//pthread_mutex_unlock(&mutex); // linux
	//mtx.unlock();	// C++11
	ReleaseMutex(g_hMutex);//释放互斥量  // Win
	return 0;
}
int main(void)
{
	//2.初始化互斥量, 默认属性
	//pthread_mutex_init(&mutex, NULL);  // linux
	g_hMutex = CreateMutex(nullptr, false, nullptr);   // Win
	//1.启动一个线程 向数组中存储内容
	//pthread_t tid, tid2;  // linux
	//pthread_create(&tid, NULL, task, (void *)"woainia!"); // linux
	//pthread_create(&tid2, NULL, task, (void *)"how"); // linux  
    // CreateThread(nullptr,0...)  // Win
	thread  th1(task, (void *)"woainia!");  // C++
	thread  th2(task, (void *)"how");		// C++
	//2.主线程进程等待,并且打印最终的结果
	//pthread_join(tid, NULL);   // linux
	//pthread_join(tid2, NULL);  // linux  
	th2.join();		// C++
	th1.join();		// C++
	//5.销毁互斥量
	//pthread_mutex_destroy(&mutex);  // linux
	CloseHandle(g_hMutex);	// Win
	Sleep(5000);
	int i = 0;
	printf("字符指针数组中的内容是:pos:%d \r\n", pos);
	for (i = 0; i < pos; ++i)
	{
		printf("%d : %s \n", i, buf[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}
二、C++11 thread
//#include <cstdlib>
//#include <cstdio>
//#include <cstring>
#include <string>
#include <iostream>
#include <thread>
using namespace std;
// 案例一
void my_print()
{
	cout << "线程开始执行了!" << endl;
	//...
	//...
	cout << "线程结束执行了!" << endl;
}
// 案例二
class TA
{
public:
	TA()
	{
		cout << "TA构造函数" << endl;
	}
	~TA()
	{
		cout << "~TA析构函数" << endl;
	}
	void operator()()	//     必须重载()  因子线程需运行函数
	{
		cout << "线程operator开始执行了!" << endl;
		//...
		//...
		cout << "线程operator结束执行了!" << endl;
	}
	TA(const TA& ta)
	{
		cout << "TA拷贝构造函数" << endl;
	}
};
int main()
{
	// 案例一 直接用函数当对象
	//std::thread thobj(my_print);
	////thobj.join();
	//bool b = thobj.joinable();
	//thobj.detach();
	//b = thobj.joinable();
	// 案例二 直接用类对象当对象
	TA t;
	std::thread thobj2(t);
	thobj2.join();		 // 此时子线程拷贝的对象 析构函数会在前台运行
	//thobj2.detach();	// 此时子线程拷贝的对象 析构函数会在后台运行
	// 案例三 lambda表达式
	//auto my_thread = [] {
	//	cout << "lambda线程开始执行了!" << endl;
	//	//...
	//	//...
	//	cout << "lambda线程结束执行了!" << endl;
	//};
	//std::thread thobj3(my_thread);
	//thobj3.join();
	//std::thread thobj3([] {
	//	cout << "lambda线程开始执行了!" << endl;
	//	//...
	//	//...
	//	cout << "lambda线程结束执行了!" << endl;
	//});
	//thobj3.join();
	printf("hello jadeshu...\n");
	//system("pause");
	return 0;
}
mutex,thread(c++11 windows linux三种方式)的更多相关文章
- java 多线程:Callable接口;FutureTask类实现对象【Thread、Runnable、Callable三种方式实现多线程的区别】
		Callable接口介绍: Java5开始,Java提供了Callable接口,像是Runnable接口的增强版,Callable接口提供了一个 call()方法可以作为线执行体. call()方法比 ... 
- 宿主机为linux、windows分别实现VMware三种方式上网(转)
		一.VMware三种方式工作原理1 Host-only连接方式 让虚机具有与宿主机不同的各自独立IP地址,但与宿主机位于不同网段,同时为宿主主机新增一个IP地址,且保证该IP地址与各虚机IP地址位于 ... 
- 宿主机为linux、windows分别实现VMware三种方式上网(转)
		一.VMware三种方式工作原理1 Host-only连接方式 让虚机具有与宿主机不同的各自独立IP地址,但与宿主机位于不同网段,同时为宿主主机新增一个IP地址,且保证该IP地址与各虚机IP地址位于 ... 
- [转载]宿主机为linux、windows分别实现VMware三种方式上网,Host-only  win10+rhel7.2实现
		研究一下虚拟机三种上网方式 转自:http://linuxme.blog.51cto.com/1850814/389691 一.VMware三种方式工作原理1 Host-only连接方式 让虚机具有与 ... 
- Linux就这个范儿 第15章 七种武器  linux 同步IO: sync、fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cutler  Linux读写内存数据的三种方式
		Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ... 
- js replace 全局替换  以表单的方式提交参数  判断是否为ie浏览器    将jquery.qqFace.js表情转换成微信的字符码  手机端省市区联动  新字体引用本地运行可以获得,放到服务器上报404  C#提取html中的汉字 MVC几种找不到资源的解决方式  使用Windows服务定时去执行一个方法的三种方式
		js replace 全局替换 js 的replace 默认替换只替换第一个匹配的字符,如果字符串有超过两个以上的对应字符就无法进行替换,这时候就要进行一点操作,进行全部替换. <scrip ... 
- 【整理】Linux下中文检索引擎coreseek4安装,以及PHP使用sphinx的三种方式(sphinxapi,sphinx的php扩展,SphinxSe作为mysql存储引擎)
		一,软件准备 coreseek4.1 (包含coreseek测试版和mmseg最新版本,以及测试数据包[内置中文分词与搜索.单字切分.mysql数据源.python数据源.RT实时索引等测 ... 
- Linux中设置服务自启动的三种方式
		有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s 在/etc/rc.d/rc*.d目录中建立/e ... 
- [转]Linux中设置服务自启动的三种方式
		from:http://www.cnblogs.com/nerxious/archive/2013/01/18/2866548.html 有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统 ... 
随机推荐
- Codeforces Round #563 Div. 2
			A:显然排序即可. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 100000 ... 
- jupyter修改默认目录
			有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10841241.html 一.修改 win10 ... 
- Servlet快速入门:第一个Servlet程序
			Servlet是整个JavaWeb开发的核心,同时也是一套规范,即公共接口.用于处理客户端发来的请求并作出响应.通常情况下我们会发送不同的请求并交由不同的处理程序来处理,例如处理用户信息和处理订单信息 ... 
- cdh的web管理界面503
			503 Service Unavailable No server is available to handle this request. 重启 agent 以及 server 
- php 图片与base64互转
			header('Content-type:text/html;charset=utf-8'); //读取图片文件,转换成base64编码格式 $image_file = '1.png'; $image ... 
- Spark foreachpartiton和mappartition的异同
			相同 都是对分区进行操作 不同 1.foreachpartition是Action操作,mappartition是Transformation操作 2.foreachpartition无返回值,map ... 
- Scala 中 call by name & call by value 的区别
			call by value:会先计算参数的值,然后再传递给被调用的函数 call by name:参数会到实际使用的时候才计算 定义方法 def return1():Int = { println(& ... 
- Linux中安装配置启动关闭nginx等一系列动作
			Nginx简介 1.Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器: 2.Nginx 是由俄罗斯人 Igor Sysoev 采用C语言开发编写的 ... 
- 某个Spring Cloud分布式架构
- MyBatis_动态sql_foreach_mysql下foreach批量插入的两种方式
			方法1: 笔记要点出错分析与总结工程组织数据库组织0.重新修改Bean类 修改1.定义接口 //批量插入 public void addEmps(@Param("emps") ... 
