多线程入门 c++

多线程

多线程 = 单线程 + 线程通信

单线程-thread

在c++11中,线程是通过thread类构造的对象;若要运行一个线程,可以创建一个类thread的实体。

创建线程

初始参数为一个函数对象,以及该函数对象所需要的参数

//子函数
void fun(int i)
{
	...
}
int main( )
{
	...	
	//fun 为函数对象,6为函数对象所需要的参数
	thread t(fun, 6);
	...
}

线程运行

可结合线程-join()函数

thread::join()是个简单暴力的方法,主线程等待子线程期间,join后面的语句都要等子线程执行完毕后才能执行。子线程执行完毕后,thread::join()还会清理子线程相关的内存空间。

可分类线程-detached()函数

thread::detached()表示子线程无需和主线程会合,也就是相分离的,各自执行各自程序,主线程无需等待子线程执行完毕;这种方式适用于并发子线程较多的情况。

销毁线程

在任何一个时间点,线程是可结合(joinable)或者是可分离的(detached),一个可结合的线程能够被其他线程回收资源和杀死,在被其他线程回收之前,它的存储器资源如栈,是不释放的,相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放

示例

#include <iostream>
#include <thread>

using namespace std;

void fun()
{
    cout<<"hello world"<<endl;
}
int main( )
{
    //创建子线程
    thread t(fun);
    //子线程申请cpu开始执行,执行完毕后释放资源
    t.join();
    //t.detach
    return 0;
}

线程通信

多线程中,最重要的就是线程的同步,同步通过通信来完成。

互斥变量 mutex

控制多线程对变量的访问权限

普通锁 lock/unlock
std::mutex g_mutex;
int num = 0;
void fun()
{
    //加锁
    mutex.lock();
    //处理数据
    ++ num;
    //解锁
    mutex.unlock();
}
自动锁 unique_lock

自动解锁;与条件变量配合使用。

std::mutex g_mutex;
int num = 0;
void()
{
    //加锁
    unique_lock<mutex> lock(g_mutex);
    ++ num;
}

条件变量 condition_variable

条件变量condition_variable用于多线程之间的通信,它可以阻塞一个或同时阻塞多个线程。

wait():

当前线程调用wait()后将被阻塞,直到另外某个线程调用notify_one唤醒线程;

notify_one():

唤醒某个wait线程,如果当前没有等待线程,则该函数什么也不做;如果同时存在多个等待线程,则唤醒某个线程是不确定的(unspecified);

使用方法

当线程被阻塞时,该函数会自动调用std::mutex的unlock()释放锁,使得其它被阻塞在锁竞争上的线程得以继续执行。一旦当前线程获得通知(notify,通常是另外某个线程调用notify_one唤醒了当前线程),wait()函数也是自动调用std::mutex的lock();

示例-多线程循环输出ABC

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值