当前位置: 首页 > news >正文

第一章 基础概念

1.1 线程与进程基础
在C++中,线程和进程是实现并发执行的基本单位。理解它们之间的区别
和如何使用它们是并发编程的基础。
1.1.1 进程
进程是程序的一次执行过程,每个进程都有独立的内存空间。这意味着进
程间的通信需要通过操作系统提供的机制,如管道、套接字等。
进程间通信方式:
参考链接:进程间通信的6种方式
1.1.2 线程
线程是进程内的一个执行单元,多个线程共享同一进程的内存空间。这使
得线程间的通信比进程间通信更高效,但也增加了数据一致性的复杂性。
线程间的通信方式:线程间通信方式
1.1.3 示例:创建线程

#include <iostream>
#include <thread>
// 线程函数
void threadFunction()
{
	std::cout << "线程函数正在执行..." << std::endl;
}
int main()
{
	// 创建线程
	std::thread t(threadFunction);
	// 等待线程结束
	t.join();
	std::cout << "主线程继续执行..." << std::endl;
	return 0;
}

此示例展示了如何在C++中创建一个线程并执行一个函数。std::thread 类用
于创建线程,t.join()用于等待线程结束。

1.2 C++11 线程库介绍
C++11 标准引入了库,提供了线程支持,使得C++程序员可以更方
便地进行并发编程。库包括std::thread 类,用于创建和管理线程,以
及线程同步的工具,如std::mutex 和std::condition_variable。
1.2.1 std::thread 类
std::thread 类是C++11 线程库的核心,它提供了创建、启动、加入和分离
线程的方法。
1.2.2 std::mutex 和std::condition_variable
std::mutex 用于保护共享资源,防止多个线程同时访问。
std::condition_variable 用于线程间的同步,可以实现线程的等待和唤醒。
1.2.3 示例:使用std::mutex 保护共享资源

#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 创建互斥锁
int sharedData = 0;
void incrementSharedData()
{
	std::lock_guard<std::mutex> lock(mtx); // 自动加锁和解锁
	for(int i = 0; i < 100000; ++i)
	{
	++sharedData;
	}
}

int main()
{
	std::thread t1(incrementSharedData);
	std::thread t2(incrementSharedData);
	t1.join();
	t2.join();
	std::cout << "共享数据的值: " << sharedData << std::endl;
	return 0;
}

在这个示例中,两个线程t1 和t2 同时尝试增加sharedData 的值。使用
std::mutex 可以确保在任何时候只有一个线程可以访问sharedData,从而避免了
数据竞争。

1.3 线程创建与管理
在C++中,线程的创建和管理主要通过std::thread 类完成。创建线程时,
可以传递一个函数或一个成员函数和对象给std::thread 的构造函数。线程的管
理包括线程的启动、等待、分离和销毁。
1.3.1 示例:创建和管理线程

#include <iostream>
#include <thread>
class MyClass
{
public:
	void myFunction()
	{
		std::cout << "线程正在执行成员函数..." << std::endl;
	}
};
int main()
{
	MyClass obj;
	// 创建线程并传递成员函数和对象
	std::thread t(&MyClass::myFunction, &obj);
	// 等待线程结束
	t.join();
	std::cout << "主线程继续执行..." << std::endl;
	return 0;
}

此示例展示了如何创建一个线程来执行类的成员函数。std::thread 的构造函数接受一个指向成员函数的指针和一个指向对象的指针。
1.3.2 线程分离
线程分离意味着线程将独立于创建它的线程运行,即使创建线程已经结束,
分离的线程也会继续运行直到完成。使用std::thread::detach()方法可以分离线
程。
1.3.3 示例:分离线程

#include <iostream>
#include <thread>
void threadFunction()
{
	std::cout << "线程正在执行..." << std::endl;
}
int main()
{
	std::thread t(threadFunction);
	// 分离线程
	t.detach();
	std::cout << "主线程继续执行,线程已分离..." << std::endl;
	return 0;
}

在这个示例中,t.detach()方法被调用来分离线程。分离后,主线程继续执行,而线程t 将独立运行直到完成。
detach()函数与join()函数的区别:【C++】join ()和detach ()函数详解和示例

相关文章:

  • 源支付开源全套,源支付V7开源全套,源支付V1.8.9,源支付开源版
  • ebay万亿韩元市场突围战:TOP3热销品类正改写平台流量规则
  • Batch Normalization:深度学习训练的加速引擎
  • 【Linux】线程池详解及基本实现
  • 条件生成对抗网络(Conditional GAN, CGAN)原理及实现(pytorch版)
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月6日第44弹
  • 微信小程序学习实录11:startLocationUpdateBackground:fail auth deny
  • C++自学笔记---指针在数组遍历中的应用
  • EMC内参二(1-45页)学习【技术进阶】
  • icpc2023西安邀请赛部分题解(GJAHE)
  • Java数组
  • 第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组:6.挖矿
  • 微信小程序学习实录12:掌握大数据量轨迹展示的MySQL结构设计
  • 关于使用HAL_ADC_Start函数时为什么要放在while里的解释
  • CSS语言的网络编程
  • 使用私有知识库取消歧义思考
  • 云轴科技ZStack CTO王为@中国GenAI大会:AI原生实践重构AI Infra新范式
  • 简洁的 PlantUML 入门教程
  • indexedDB前端数据库存储使用
  • d202546
  • 浙江网站建设推广公司找哪家/2024年重大新闻摘抄
  • 推广型网站建设网址/海外seo
  • 网站建设项/百度云网盘免费资源
  • 那里可以做工作室做网站/在线seo外链工具
  • 网站设计模板中的页/平面设计主要做什么
  • 深圳做外贸网站多少钱/企业管理培训课程网课免费