![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++多线程
文章平均质量分 60
多线程学习
多方通行8
啥都会一点的卷人,因为都会一点,所以发的东西也不规律,有心情就发东西,没心情就学习
我是卷心菜,越卷越菜。
展开
-
C++多线程学习(十七、简单实现线程池)
通过将需要执行的任务(函数)依次添加到队列中,可以实现任务的顺序执行,避免了函数之间的并发访问问题。调用者可以按照自己的需求,从队列中取出函数对象并进行执行,从而实现任务的调度和执行。使用这个函数模板,可以方便地将任务插入到队列中,并在需要时获取任务的执行结果。整个过程中,线程池使用互斥锁mtx_queue来保证多个线程对任务队列的访问是线程安全的。同时,条件变量cv用于在任务队列为空或线程池停止时进行通知和等待。这段代码的作用是将一个任务添加到线程池的任务队列中,并返回一个future。原创 2023-07-10 18:03:04 · 392 阅读 · 0 评论 -
C++多线程学习(十六、STL算法中的并行版本,sequenced_policy)
增加参数:sequenced_policy提供相应并行版算法。并行算法执行的可以并行以及向量化。看看3种的执行时间都是多少。并行算法执行可以不并行化。并行算法执行可以并行化。原创 2023-07-10 14:33:29 · 244 阅读 · 0 评论 -
C++多线程学习(十五、CAS与ABA问题,CAS实现简单的无锁线程安全链表)
假设有两个线程,A和B,现在他们获取了一个指针pApple,这个指针指向了数据w,假设B先执行,他将指针pApple所指向的数据w进行了释放,线程重新生成的时候,恰好生成的内存也在w所在的位置,并写入了内存。线程A读取一个共享变量的值为A,然后线程B修改该共享变量的值为B,最后又恢复为A,而线程A此时执行CAS操作,会发现该共享变量的值仍然是A,于是CAS操作成功,但实际上该共享变量已经发生了变化。在多线程环境中,多个线程同时访问共享的数据,如果不采取措施进行同步,可能会导致数据不一致或者竞争条件的问题。原创 2023-07-10 12:03:01 · 626 阅读 · 0 评论 -
C++多线程学习(十四、细粒度锁队列)
是针对于对象进行一个加锁的过程。是一种并发编程中常用的同步机制,用于解决多线程竞争问题,通过将一个共享资源划分为多个较小的部分,并为每个部分分配一个独立的锁来实现并发控制。创建细粒度锁队列需要按照共享资源的逻辑结构进行划分,并为每个部分分配一个独立的锁。可以通过自定义锁对象或者使用并发集合类中提供的锁来实现。是提高并发性能。在多线程环境中,当多个线程同时访问同一个共享资源时,会引发竞争条件,导致性能下降和数据不一致的问题。原创 2023-07-10 00:03:45 · 288 阅读 · 0 评论 -
C++多线程学习(十三、简单的线程安全栈封装)
目录简单的线程安全栈封装上面的代码为什么不用解锁?输出结果为什么不为0在构造函数和成员函数中使用了lock_guard lock(mtx),这是一个RAII(Resource Acquisition Is Initialization)技术【资源获取即初始化】,它在构造时会锁定互斥量,析构时会自动解锁互斥量。所以不需要手动解锁。如果最后输出的size的结果不为0,假设是29个,表示在进行多线程的插入和弹出操作后,栈中剩余的元素个数是29个。这可能是由于在插入和弹出操作之间的竞争情况下,一原创 2023-07-09 20:28:32 · 368 阅读 · 0 评论 -
C++多线程学习(十二、特殊的原子类型atomic_flag,自旋锁)
其他的原子类型是可以通过is_lock_free()来判定是否无锁。原创 2023-07-08 18:11:15 · 356 阅读 · 0 评论 -
C++多线程学习(十一、原子操作和原子类型)
atomic的特化类型在知道了atomic是有专门用于不同。原创 2023-07-08 16:49:33 · 330 阅读 · 0 评论 -
C++多线程学习(十、生产者消费者模式)
通过多线程的方式,生产者将数据放入一个共享的缓冲区中,而消费者从缓冲区中获取数据进行处理。当消费者线程的数量达到了仓库的大小时,说明所有的消费者线程已经使用完了,需要重新开始计数。生产者线程将使用互斥锁来保护对缓冲区的访问,并在产生数据后通过条件变量通知消费者线程。这样做的目的是实现循环使用生产者和消费者线程的效果,使得每个生产者和消费者线程都能循环使用,不会因为达到边界而停止工作。8. 当生产者线程产生数据并将数据放入缓冲区后,需要释放互斥锁,以便其他线程可以访问缓冲区。原创 2023-07-08 13:43:20 · 934 阅读 · 0 评论 -
C++多线程学习(九、不安全的队列测试,简单封装线程安全队列)
由于代码中的线程t是在后台运行的,所以无法确定线程t是否已经完成了对myQ队列的操作,因此在主线程中处理myQ队列时,可能会出现竞争条件或者数据不一致的情况,导致输出的结果不确定。原创 2023-07-07 22:24:57 · 1263 阅读 · 0 评论 -
C++多线程学习(八、条件变量:condition_variable)
3.notify_one,notify_all唤醒线程。2.unique_lock 加锁线程。1.调用wait函数阻塞线程。原创 2023-07-06 18:55:18 · 199 阅读 · 0 评论 -
C++多线程学习(七、unique_lock)
1、正确的锁定顺序:在使用多个unique_lock对象对多个互斥量进行锁定时,应保持相同的锁定顺序,以避免死锁。在选择锁定策略时,需要考虑是否希望避免阻塞线程,或者需要在特定条件下重新尝试锁定。时,应尽可能缩小锁定的粒度,以避免不必要的性能开销。在使用时,应避免无谓的锁定和解锁操作,以提高性能。使用defer_lock,是给你安装了一个没有上锁的锁,需要自己去手动上锁。提供了异常安全性,即在异常发生时,会自动释放互斥量。时,需要根据具体需求选择适当的互斥量类型。6、选择适当的互斥量:在选择使用。原创 2023-07-06 17:57:13 · 1077 阅读 · 0 评论 -
C++多线程学习(六、互斥锁Mutex,lock,unlock,lock_guard函数)
(互斥量)创建mutex类的对象。类似于一个自动的锁,不能做。原创 2023-07-06 16:58:29 · 757 阅读 · 0 评论 -
C++多线程学习(五、容器批量创建线程和只读数据共享)
在进行输出时,涉及到了流的缓冲机制,即数据先会被缓存在内存中,然后再一次性输出到终端。而在多线程环境下,每个线程都有可能先将数据缓存在自己的内存中,然后再统一输出,导致输出的顺序混乱。函数在每次打印时直接将数据输出到终端,不需要进行缓冲,因此不会出现混乱的情况。关于打印cout会导致混乱解决方法很简单,用print即可。稳定安全,不需要特殊处理,直接读取即可。原创 2023-07-05 22:02:56 · 316 阅读 · 0 评论 -
C++多线程学习(四、带返回值的线程处理函数)
2:通过get_future获取future对象,再通过get()方法获取线程处理函数中值【一旦通过get_future获取到future对象后,就不能再次调用get_future函数来获取新的future对象(除非你创建一个新的)】2.通过packaged_task的对象调用get_future获取future对象,再通过get()方法得到子线程处理函数的返回值。2.通过future对象中的get()方法获取线程函数的返回值。:启动一个异步的任务,创建线程并执行线程处理函数,原创 2023-07-04 23:51:24 · 979 阅读 · 0 评论 -
C++多线程学习(三、线程处理函数【get_id、sleep_for、yield、sleep_until】)
【代码】C++多线程学习(三、线程处理函数【get_id、sleep_for、yield、sleep_until】)原创 2023-07-04 15:48:24 · 400 阅读 · 0 评论 -
C++多线程学习(二、多线程的几种创造方式【有返回值的之后讲】)
函数,来将智能指针ptr从主线程移动到新的子线程中,将ptr的所有权转移到子线程中,以便在子线程中正确访问智能指针的资源,可以实现将智能指针的所有权从一个上下文转移到另一个上下文。因为智能指针是不能被复制的,而是具有所有权的资源管理对象,因此不能直接传递给子线程的函数。原创 2023-07-03 23:37:14 · 187 阅读 · 0 评论 -
C++多线程学习(一、简单概念理解)
举例:任务管理器就是一个个的进程,比如任务管理器中的VS左边有一个小箭头,打开后,可以看到下面还有一个个的进程【一个软件一般都是多进程程序】例子:主线程1秒执行完成,子线程3秒执行完成,如果使用detach(),主线程做完结束了,子线程还没有完成则无法打印出字符。例子:一个宿舍,一个厕所,有一个人去上厕所了,总不能让另一个人一起进来上吧,所以要给门上锁。5.4:join()函数:加入/汇合线程,阻塞主线程【子线程没完成,会等待子线程完成】每个进程都有一个且唯一的主线程,每一个进程只有一个主线程。原创 2023-07-03 00:30:23 · 245 阅读 · 0 评论