
多线程
捕鲸叉
C++软件架构与开发工程师 擅长Windows/Linux/Macos 和Arm/STM32下C++软件开发,熟悉QT/MFC/STL/BOOST/VTK/ITK等开发库,熟悉应用程序与设备驱动程序(内核)开发
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
多线程编程中,使用 std::mutex 需要注意一些潜在的问题
使用 std::mutex 保护共享数据是多线程编程中的重要技术,但需要注意保护数据太少或太多、死锁、持有锁时间太长等问题。通过合理的锁设计、固定的加锁顺序、细粒度锁、分批处理等措施,可以有效避免这些问题,提高多线程程序的性能和稳定性。原创 2024-11-10 23:03:28 · 1564 阅读 · 0 评论 -
创建线程时传递参数给线程
创建线程时传递参数给线程原创 2024-11-02 23:20:51 · 2001 阅读 · 1 评论 -
线程的joinable属性,以及主线程出现异常时,对其等待应该进行的处理
在C++多线程编程中,线程的 joinable 属性是一个重要的概念,用于判断线程是否可以调用 join() 或 detach() 方法。当线程已经调用过 join() 或 detach() 之后,它将不再 joinable,此时调用 join() 或 detach() 会导致程序崩溃。在多线程程序中,如果主线程在等待子线程完成的过程中发生异常,需要确保子线程能够安全地被 join() 或 detach(),以避免资源泄露或未定义行为。通过这些技术,开发者可以确保多线程程序的健壮性和安全性。原创 2024-11-02 21:49:31 · 546 阅读 · 0 评论 -
线程的等待,分离,与异步获取执行结果
在C++中,可以通过不同的方式来处理线程的等待、分离,以及异步获取执行结果原创 2024-11-02 21:24:21 · 347 阅读 · 0 评论 -
线程函数和线程启动的几种不同形式
在C++中,线程函数和线程启动可以通过多种形式实现。使用 std::async 和 std::future 可以启动一个带返回值的线程函数。通过这些方法,开发者可以根据具体需求选择最合适的线程启动方式。Lambda 表达式提供了一种简洁的方式来定义线程函数。可以通过定义一个函数对象(Functor)来启动线程。线程函数可以接受参数,并将这些参数传递给线程函数。最基本的方式是使用函数指针来启动线程。线程函数和线程启动的几种不同形式。可以通过类的成员函数来启动线程。使用成员函数启动线程。使用带参数的线程函数。原创 2024-11-02 18:49:38 · 729 阅读 · 0 评论 -
你好,C++并发世界
C++并发编程的主要目的是任务隔离和提高性能。具体来说,可以总结为以下几点:任务隔离:通过并发编程,程序可以将不同的任务或计算分隔开,这样可以防止它们之间的相互干扰,提高程序的稳定性和可维护性。每个线程可以独立执行,减少了任务之间的耦合。提高性能:利用多核处理器的优势,C++并发编程可以实现更快的计算速度。通过并行处理,可以同时执行多个任务,充分利用CPU的资源,从而显著提高程序的性能。响应性:在需要处理大量输入或外部事件的应用程序(如图形用户界面或网络服务)中,并发编程可以提升响应性。原创 2024-11-02 13:09:53 · 871 阅读 · 0 评论 -
有依赖关系多个任务的并行处理一则
有依赖关系多个任务的并行处理一则原创 2024-07-26 11:48:06 · 694 阅读 · 0 评论 -
C++ 并发编程练习15 “最简单的线程池”
下面的代码展示了一个简单的线程池。#include <atomic>#include <functional>#include <iostream>#include <mutex>#include <queue>#include <thread>#include <vector>template<typename T>class thread_safe_queue{private:原创 2022-05-02 16:32:59 · 1102 阅读 · 0 评论 -
C++并发编程练习14 “异步任务测试”
使用feature特性,可以获得异步执行的效果。如下面的例子#include <iostream> #include <future> #include <chrono> #include <thread> int loopType (int from, int to) { for (int i = from; i != to; ++i) { std::cout <原创 2022-05-02 15:13:10 · 994 阅读 · 0 评论 -
C++并发编程练习13 “线程安全栈设计”
使用mutex锁,设计一个线程安全的stack,示例如下#include <exception>#include <memory>#include <mutex>#include <stack>struct empty_stack : std::exception{ const char* what() const throw();};template<typename T>class threadsafe_sta原创 2022-04-23 17:57:56 · 806 阅读 · 0 评论 -
C++并发编程练习12 “在跨线程中使用函数对象(指针)”
需要谨慎防止被保护的对象意外泄露到外界函数被更改状态。代码示例如下:#include <functional>#include <iostream>#include <mutex>#include <string>#include <thread>struct TData{public: int n; std::string str;public: TData() { n = 0; str = "Mout原创 2022-04-23 16:28:19 · 1013 阅读 · 0 评论 -
C++并发编程练习11 “互斥量”
在多线程开发中,常遇到共享数据需要保护的问题,我们可以使用互斥量std::mutext类来解决这个问题,示例如下#include <chrono>#include <iostream>#include <mutex>#include <thread>#include <vector>struct scoped_mutex{ scoped_mutex(std::mutex& mtx) : mt(mt原创 2022-04-23 15:14:13 · 639 阅读 · 0 评论 -
C++并发编程练习10 “线程管理之线程ID”
std::thread有一个get_id()函数可以唯一标识系统中线程。示例如下#include <chrono>#include <iostream>#include <string>#include <thread>#include <vector>std::thread::id master;void func(int i){ std::string msg = std::to_string(i);原创 2022-04-23 00:10:48 · 1033 阅读 · 0 评论 -
C++并发编程练习09 “线程管理之线程数目动态确定”
我们可以动态计算并创建合理的线程数目, 代码示例如下#include <algorithm>#include <functional>#include <iostream>#include <numeric>#include <thread>#include <vector>template<typename Iterator, typename T>struct accumulate_block{原创 2022-04-22 23:50:12 · 228 阅读 · 0 评论 -
C++并发编程练习08 “线程管理之线程容器”
我们可以使用容器保存一组线程,如下面的vector装入一组线程:#include <chrono>#include <iostream>#include <string>#include <thread>#include <vector>void func(int n){ std::string str = std::to_string(n); str += '\n'; std::cout <<原创 2022-04-22 22:40:44 · 436 阅读 · 0 评论 -
C++并发编程练习07 “线程管理之线程scoped”
线程scoped在某些场合还是很有用的,可以简化编程,不易出错。示例如下:#include <exception>#include <iostream>#include <thread>struct scoped_thread{ std::thread th; scoped_thread(std::thread&& t) { if (!t.joinable()) throw std::runtime_error("threa原创 2022-04-22 22:19:32 · 338 阅读 · 0 评论 -
C++并发编程练习06 “线程管理之线程对象转移“
线程对象可以和一般对象一样,其所有权可以被转移,示例如下:#include <iostream>#include <thread>void get(std::thread&& t){ t.detach(); int a; std::cin >> a; std::cout << a << std::endl;}void task(const char* sz){ std::cout << s原创 2022-04-22 22:03:47 · 330 阅读 · 0 评论 -
C++并发编程练习05 “线程管理之传递引用参数给任务函数与std::ref绑定”
传递引用时需注意,如下面代码注释中所述:#include <iostream>#include <thread>void task(int& n){ n *= 2;}int main(){ int a = 100; //注意必须用std::ref绑定,否则由于thread构造函数无法识别,它将传入a的副本的引用给task函数 std::thread t(task, std::ref(a)); t.join()原创 2022-04-22 20:31:57 · 309 阅读 · 0 评论 -
C++并发编程练习04 “线程管理之传递参数给任务函数”
我们可以对不同的多线程任务函数传递对应参数。其参考代码如下:#include <iostream>#include <thread>void task(int n, const char* message){ std::cout << n << "," << message << std::endl;}int main(){ std::thread t(task, 1, "something hap原创 2022-04-22 20:17:08 · 330 阅读 · 0 评论 -
C++并发编程练习03 “线程管理之线程守卫”
包装类对象析构时执行线程#include <iostream>#include <thread>struct thread_guard{public: std::thread& t; explicit thread_guard(std::thread& _t) : t(_t) {}; ~thread_guard() { if(t.joinable()) t.join(); } thread_guard(thread_guard&原创 2022-04-22 10:26:31 · 314 阅读 · 0 评论 -
C++并发编程练习02 “线程管理之启动线程”
启动线程有detach()和join()两个函数,前者是异步启动,后者是同步启动并等待结束。#include <iostream>#include <thread>struct task{ int& i; task(int& i_) :i(i_) {}; void operator()() { for (int j = 0; j < 200; j++) std::cout原创 2022-04-22 10:12:38 · 205 阅读 · 0 评论 -
C++并发编程练习01 “Hello World“
#include <iostream>#include <thread>void sayHello(){ std::cout << "Hello World!\n";}int main(){ std::thread t(sayHello); t.join(); return 0;}原创 2022-04-22 10:05:50 · 173 阅读 · 0 评论