欢迎使用CSDN-markdown编辑器
来源:互联网 发布:天下3用数据流量玩 编辑:程序博客网 时间:2024/06/06 02:50
C++简单多线程
c++多线程里面除了指定函数开始新线程外,也可以用可调用(callable)类型构造,将带有函数调用符类型的实例传入std::thread类中,替换默认的构造函数。代码如下:
// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <thread>using namespace std;void hello(int k){ //static int num = 1; cout << "hello" <<k<< endl;}class background_task{public : background_task(){ mark = new int(1); cout << "Hello ,this is background_task" << endl; } void operator() () const{ for (int i = 0; i < 10;i++) cout << *mark << endl; cout << "This is operator" << endl; } void setMark(){ ( *mark) ++; } void getPutMark(){ cout << "This is GetPut" << *mark << endl; }private : int* mark;};int _tmain(int argc, _TCHAR* argv[]){ background_task k; thread t(k); k.setMark(); k.getPutMark(); t.join(); return 0;}
在代码里面,我们创建了一条多线程,其中类内的变量mark可以换成一个int的类型,这里声明为指针主要是为了验证thread t(k)是否复制了了k对象的资源。因此共享资源时候,要将共享的资源声明为一个指针的形式,不然线程只改变其副本。
值得注意的是thread()中不可用临时对象变量,要用命名对象,不然C++编译器会将其解析为函数声明而非类型对象定义如下:
thread my_thread(background_task());
这里的声明相当于声明了一个名为my_thread的函数,参数为一个返回为background_task对象,参数为空的函数。
解决方法有
std::thread my_thread((background_task())); // 1std::thread my_thread{background_task()}; // 2
也可以用lambda表达式改写上述例子。
std::thread my_thread([]{ do_something(); do_something_else();});
在thread传递参数时,要注意默认参数要拷贝到线程独立内存里,即使参数是引用格式:
void f(int i, std::string const& s);std::thread t(f, 3, "hello");
这里的hello本来就不能直接赋值给s的,也可以从这看出。
当然你可以加上ref要说明这是传递引用参数。
thread t(hello,ref(ka));
0 0
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 选区警告
- 文章标题
- android 登录回调处理
- 2016.06.15廖雪峰JS__学习笔记(JSON)__P7
- ORACLE语句多条重复记录中只取一条时间最近的记录
- 欢迎使用CSDN-markdown编辑器
- JSON和JSONP
- IOS-- UIView中的坐标转换
- 人脸识别之特征脸方法(Eigenface)
- 批处理获取当前时间脚本
- 5-17 爬动的蠕虫 (15分)
- IOS_app源码
- MySQL 常用函数 加密函数
- JUnit 测试