多线程:线程管理

线程管理

基本操作
1、启动线程
C++中启动线程的方法很简单,就是调用 std:: thread 实例化一个线程对象,通常实例化的过程中会指定一个”任务“。而所谓的”任务“通常是一些函数之类的操作。可以通过某种通信机制来得到解决函数的执行过程中需要传递参数、一些独立的操作(线程停止等)。
void  do_sth() {  }
std::thread my_thread(do_sth);//启动线程
当传入的是一个临时变量时,C++编译器会将该语句认为是一个函数声明而不是启动线程。解决办法是使用多重圆括号或者花括号。
std::thread my_thread(do_sth());//并不会启动线程,只是申明了一个my_thread函数,其参数为一个函数,返回的是一个thread对象;
std::thread my_thread((do_sth()));//启动线程
std::thread my_thread{do_sth()};//启动线程

2、加入 or 分离
my_thread.join() 函数指明了加入,需要等待线程完成,一个线程只能使用一次join()函数。my_thread.detach()指明分离,并不需要等待线程完成。通常分离线程称为守护线程。

传递参数
向std::thread构造函数中的可调用对象,或函数传递参数,只需要在构造的时候添加相应的参数即可。
但是,默认参数要拷贝到线程独立内存中,即使参数是引用的形式,也可以在新线程中进行访问。
当使用指针等方法传递参数时,如果涉及到数据的转换,最好的方式是执行显示转换而尽量不用隐式转换。
线程构造函数会无视参数的类型,只会对传递的参数执行拷贝操作,避免此种情况的发生是使用ref将传递进来的参数转换成引用形式。
void do_std(int i , string & j);
string s = "vvv";
char buffer[] = "abc";
thread t1(do_std, 2, "aa");
thread t2(do_std, 2, string(buffer));
thread t3(do_std, 2, ref(s));//将s转换为引用的参数,线程的操作会改变此处s的值;
可以传递一个成员函数指针作为线程函数,并提供一个合适的对象指针作为第一个参数,第三个参数就是成员函数的第一个参数,以此类推。
class X
{
public:
  void do_lengthy_work(int);
};
X my_x;
int num(0);
std::thread t(&X::do_lengthy_work, &my_x, num);
转移线程所有权
当线程的所有权需要发生转移时,可以使用move函数来实现。对一个线程对象进行赋值或者转移时,必须保证该线程对象没有关联其他线程对象。当thread对象支持移动操作时,意味着线程的所有权可以在函数外进行转移;当thread对象的所有权可以在函数内部传递时,就允许thread对象作为参数进行传递。
void some_function();
void some_other_function();
std::thread t1(some_function);            // 1
std::thread t2=std::move(t1);            // 2
t1=std::thread(some_other_function);    // 3
std::thread t3;                            // 4
t3=std::move(t2);                        // 5
t1=std::move(t3);                        // 6 赋值操作将使程序崩溃
线程运行数量
std::thread::hardware_concurrency()这个函数将返回能同时并发在一个程序中的线程数量。例如,多核系统中,返回值可以是CPU核芯的数量。返回值也仅仅是一个提示,当系统信息无法获取时,函数也会返回0。

识别线程
线程标识类型是std::thread::id,通过调用线程对象的get_id()来获得。默认情况下不指明调用对象时返回的当前线程的id。线程id支持比较、拷贝等操作。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值