C++ 多线程编程和线程池

这篇具有很好参考价值的文章主要介绍了C++ 多线程编程和线程池。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

c++ 多线程需要包含thread头文件

#include <thread>std::thread t(function_name, args...);

多线程调用函数代码如下

#include <iostream>
#include <thread>
void print_message() 
{    
	std::cout << "Hello, world!" << std::endl;
}
int main() 
{    
	 std::thread t(print_message);    
	 t.join();
	     
	 return 0;
}

子线程和主线程同时执行,当子线程没执行完,主线程结束时,程序就会报错

join,主线程等待子线程执行完成后再执行,只能使用一次
detach,主程序结束,子线程会在后台执行
joinable,判断线程是否可以调用join和detach

//当子线程没有执行完时,主线程会阻塞在join()位置
bool isJoin = thread.joinable()
if(isJoin)
{
	thread.join()// 让主线程等待子线程
}

note:
1、右值传递给左值引用会报错可以使用std::ref ,右值引用
2、多线程中传递的指针可能存在被释放的问题需要注意
3、线程安全,多线程的运行程序和单线程的运行结果都是一样的

实现线程安全可以使用互斥锁、信号量、条件变量等操作

//互斥锁
std::mutex mtx;
mtx.lock();
//...
mtx.unlock();

lock_gurad,只在局部作用域中使用,不能复制和移动,轻量级锁
unqiue_lock,重量级锁,可以手动加锁、延迟加锁

手写实现一个线程池

#include <iostream>
#include <thread>
#include <mutex>
#include <string>
#include <queue>
#include <vector>
#include <functional>
#include <condition_variable>

class ThreadPool {
public:
	ThreadPool(int numTread) : stop(false)
	{
		for (int i = 0; i < numTread; i++)
		{
			threads.emplace_back([this]
			{
				while (1)
				{
					std::unique_lock<std::mutex> lock(mtx);
					condition.wait(lock, [this]
						{
							return !tasks.empty() || stop;
						});
					if (stop && tasks.empty())
					{
						return;
					}

					std::function<void()> task(std::move(tasks.front()));
					tasks.pop();
					lock.unlock();
					task();
				}
			});

		}
	}

	~ThreadPool()
	{
		{
			std::unique_lock<std::mutex> lock(mtx);
			stop = true;
		}
		condition.notify_all();
		for (auto& t : threads)
		{
			t.join();
		}
	}

	template<class F,class ... Args>
	void enqueue(F&& f, Args&& ... args)
	{
		std::function<void()> task =
			std::bind(std::forward<F>(f), std::forward<Args>(args)...);
		{
			std::unique_lock<std::mutex> lock(mtx);
			tasks.emplace(std::move(task));
		}
		condition.notify_one();
	}
private:
	bool stop;
	std::condition_variable condition;
	std::mutex mtx;
	std::vector < std::thread > threads;

	std::queue < std::function<void()>> tasks;
};
int main()
{
	// 创建一个线程池,里面包含4个线程
	ThreadPool pool(4);

	// 4个线程执行10个任务
	for (int i = 0; i < 10; i++)
	{
		// 往线程池里加任务
		pool.enqueue([i]()
			{
				std::cout << "task : " << i << " is runing " << std::endl;
				std::this_thread::sleep_for(std::chrono::seconds(1));
				std::cout << "task : " << i << " is done " << std::endl;
			}
		);
	}
	return 0;
}

参考资料
1、http://www.seestudy.cn/?list_9/31.html文章来源地址https://www.toymoban.com/news/detail-806749.html

到了这里,关于C++ 多线程编程和线程池的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 多线程之OpenMP并行编程使用详解

    总结OpenMP使用详解 本文转载自:https://blog.csdn.net/AAAA202012/article/details/123665617?spm=1001.2014.3001.5506   OpenMP(Open Multi-Processing)是一种用于共享内存并行系统的多线程程序设计方案, 支持的编程语言包括C、C++和Fortran。 OpenMP提供了对并行算法的高层抽象描述, 通过线程实现并行化

    2024年02月06日
    浏览(42)
  • C++ 多线程编程(二) 各种各样的锁

      目录 前言 一、基本锁 1. 互斥锁(mutex) 2. 定时互斥锁(timed_mutex) 3. 条件变量 (condition_variable) 4. 读写锁 (shared_mutex) 5. 递归锁(recursive_mutex) 6. 自旋锁 (spinlock) 二、RAII锁 1. lock_guard 2. unique_lock 3. shared_lock 三、信号量 总结 多线程编程一个重要的问题就是数据竞争

    2024年02月15日
    浏览(51)
  • C++多线程编程(第三章 案例1,使用互斥锁+ list模拟线程通信)

    主线程和子线程进行list通信,要用到互斥锁,避免同时操作 1、封装线程基类XThread控制线程启动和停止; 2、模拟消息服务器线程,接收字符串消息,并模拟处理; 3、通过Unique_lock和mutex互斥方位list 消息队列 4、主线程定时发送消息给子线程; 代码包含了XThread类(基类)、

    2024年02月15日
    浏览(36)
  • 《C++并发编程实战》读书笔记(2):线程间共享数据

    在C++中,我们通过构造 std::mutex 的实例来创建互斥量,调用成员函数 lock() 对其加锁,调用 unlock() 解锁。但通常更推荐的做法是使用标准库提供的类模板 std::lock_guard ,它针对互斥量实现了RAII手法:在构造时给互斥量加锁,析构时解锁。两个类都在头文件 mutex 里声明。 假设

    2024年02月10日
    浏览(43)
  • 从汇编代码的角度去理解C++多线程编程问题

    目录 1、多线程问题实例 2、理解该多线程问题的预备知识 2.1、二进制机器码和汇编代码

    2024年02月06日
    浏览(36)
  • c++并发编程实战-第3章 在线程间共享数据

    多线程之间共享数据,最大的问题便是数据竞争导致的异常问题。多个线程操作同一块资源,如果不做任何限制,那么一定会发生错误。例如: 输出: 显然,上面的输出结果存在问题。出现错误的原因可能是: 某一时刻, th1线程获得CPU时间片,将g_nResource从100增加至200后时

    2024年02月08日
    浏览(37)
  • C++多线程编程实践:从基础到实例的全面指南

    进程是系统资源分配和调度的基本单位,也是程序的一次执行过程。线程是进程的一个执行单元,是操作系统调度的基本单位。 多线程程序在提高计算机系统的并发性和响应性方面有着极其重要的作用。它可以更好地利用计算机的多核和多处理器资源,在提高系统吞吐量的同

    2024年02月08日
    浏览(38)
  • Linux C++ 网络编程基础(2) : TCP多线程一个server对应多个client

    作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/   tcp编程时, 一个server可以对应多个client, server端用多线程可以实现. linux下多线程可以使用POSIX的线程函数, 下面给出服务端和客户端的代码.   Linux POSIX线程库提供了一组函数来创建、管理和同步

    2024年02月13日
    浏览(49)
  • 多线程并发编程-线程篇

    系统中的一个程序就是一个进程,每个进程中的最基本的执行单位,执行路径就是线程,线程是轻量化的进程。 绿色线程,由用户自己进行管理的而不是系统进行管理的,我理解就是一个进程里面可以有多线程,一个线程里面有多进程(go里面叫协程) 线程是按照CPU分的时间

    2023年04月21日
    浏览(37)
  • 【Linux C | 多线程编程】线程的创建、线程ID、线程属性

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 ⏰发布时间⏰:2024-03-22 09:05:41 本文未经允许,不得转发!!! Linux线程库接口包括线程的创建、 退出、 取消和分离, 以及连接已经终止的线程, 互斥量

    2024年03月26日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包