欢迎使用CSDN-markdown编辑器

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()));  // 1
std::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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值