C++多线程——thread

thread

C++11提供了语言层面上的多线程,包含在头文件#include <thread>中。它解决了跨平台的问题,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类

简单例子

#include <thread>  //多线程
#include <chrono> // 操作时间
void thread_1(std::string out)
{
	for (int i = 0; i < 10; i++)
	{
		cout << out << endl;
		std::this_thread::sleep_for(std::chrono::seconds(1));  // 秒

	}
}

int main()
{
	std::string out1 = "线程1##########################";
	std::string out2 = "线程2**************************";


	thread first(thread_1,out1); 
	thread second(thread_1, out2);

	//必须说明添加线程的方式
	// detach():异步的方式
	// join():停等的方式
	first.detach();             
	second.join();
	std::cout << "子线程结束./n";//必须join完成
	return 0;
}

结果:
线程2**************************线程1##########################

线程2**************************线程1##########################

线程2**************************
线程1##########################
线程1##########################
线程2**************************
线程1##########################
线程2**************************
线程1##########################
线程2**************************
线程2**************************线程1##########################

线程1##########################
线程2**************************
线程2**************************
线程1##########################
线程1##########################
线程2**************************
子线程结束./n

获取线程 ID

  • std::this_thread::get_id() 是C++中用于获取当前线程ID的方法。它属于#include <thread> 头文件中的 std 命名空间。
  • 获取线程ID是在线程函数中获取,再一次执行中线程的ID值不会变化,但再次运行ID值会变化
// C++多线程
#include <thread>  //多线程
#include <chrono> // 操作时间
void thread_1(std::string out)
{
	for (int i = 0; i < 10; i++)
	{
		std::thread::id thread_id = std::this_thread::get_id();  // 获取线程ID值
		std::cout << "Thread ID: " << thread_id << std::endl;    // 打印ID值
		cout << out << endl;
		std::this_thread::sleep_for(std::chrono::seconds(1));  // 秒

	}
}

int main()
{
	std::string out1 = "线程1##########################";
	std::string out2 = "线程2**************************";


	std::thread first(thread_1,out1); 
	std::thread second(thread_1, out2);

	first.detach();             
	second.join();

	std::cout << "子线程结束./n";//必须join完成
	return 0;
}

结果:
线程2**************************
Thread ID: 1964
线程1##########################
Thread ID: 18540
线程2**************************
Thread ID: 1964
线程1##########################
Thread ID: 18540
线程2**************************

互斥锁

  • std::mutex 是C++中的互斥量(mutex)类,用于创建互斥锁,实现对共享资源的互斥访问保护。它属于 头文件中的 std 命名空间。
#include <thread>
#include <mutex>

std::mutex mtx;  // 创建一个互斥量对象
int shared_variable = 0;  // 共享资源

void task() 
{
    // 上锁
    mtx.lock();

    // 修改共享资源
    shared_variable += 1;

    // 打印共享资源的值
    std::cout << "Current value: " << shared_variable << std::endl;

    // 解锁
    mtx.unlock();
}
int main() {
    std::thread thread1(task);
    std::thread thread2(task);

    thread1.join();
    thread2.join();

    return 0;
}
  • mtx.lock()将互斥锁上锁,此时其他线程如果试图获取锁则会被阻塞
  • 永远不要忘记调用mtx.unlock()来释放互斥锁,否则会导致死锁问题
  • 最好将互斥锁的上锁和解锁操作放在一个try/catch块中,以确保即使出现异常,互斥锁也能被正确释放。
  • 尽量减小互斥锁的范围,只在需要保护共享资源的临界区内上锁。避免在锁外执行耗时操作,以充分发挥多线程并发性能。
  • 如果有多个互斥锁,确保按照相同的顺序对它们进行上锁,以避免死锁的可能。

放弃执行

std::this_thread::yield() 函数的作用是提示线程调度器将当前线程放弃执行,以便让其他就绪态的线程有机会被调度执行。换句话说,它是一种线程主动让出CPU执行的方式

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值