![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 97
fling_forever
这个作者很懒,什么都没留下…
展开
-
(终)c++多线程thread操作(十)多线程并行实现数据相加的和
经过了前面章节内容的学习,下面我们一起来实现一个多线程实现求多个数据相加的和。(这里没有用数组实现,原因在于内存分配给数组的不能有太大空间,N受到限制,不好调试。但是与数组实现方式完全一样!)假设所要求解的数据长度是N,cpu的核心数是m;很容易考虑到应将数据尽可能等分给每个cpu运行,故每个cpu运行的数据是:;其中:其实现代码如下:这里实现获取子线程结果的方式是加入的引用变量;(可以用future变量,很可惜就是不能提速)#include <iostream>#i原创 2020-06-28 15:51:54 · 4286 阅读 · 2 评论 -
c++多线程thread操作(九)可调用方式
thread可调用的方式如下:#include <iostream>#include <thread>using namespace std;class A {public: void f(int x, char c); int operator()(int m) { return m*m; }};void foo(int x){}int main() { A a; thread t1(a, 6);//传递a的拷贝给子线程 thread t2(ref(a原创 2020-06-28 13:22:01 · 812 阅读 · 0 评论 -
c++多线程thread操作(八)父线程传递数据给子线程
实现父线程和子线程的交互1. 实现方式:主线程定义promise,然后在主线程中设定promise的数据,子线程可以直接从主线程的promise中获取数据;int factorial(future<int>&f) {//将结果返回给x int res = 1; int N = f.get();//主线程不set_value,会发生异常 for (int i = N; i > 1; i--) { res *= i; } cout << "res原创 2020-06-28 13:19:55 · 2561 阅读 · 0 评论 -
c++多线程thread操作(七)父进程获取子进程变量的结果
问题:如果我们在主线程中需要将一个计算资源大的操作丢给子线程做,那我们应该如何从子线程中获取结果呢?可尝试的方案1:在主线程中定义一个引用变量在子线程中,然后将引用变量的结果在主线程中输出;void sum_res(int N, int &x) {//将结果返回给x int res = 0; for (int i = N; i >= 1; i--) { res += i; } x = res;}int main() { int x; thread t1(sum原创 2020-06-28 12:15:41 · 2837 阅读 · 0 评论 -
c++多线程thread操作(六)条件变量的使用
1. 说到条件变量,我们先来看一个操作系统的PV操作,解决经典的生产者与消费者问题;题目:一个生产者生产若干产品放到缓冲区上,一个消费者从缓冲区中取产品。二者共用一个缓冲区,里面的同步关系:1. 生产者在缓冲区不满的情况下可以放入;设定一个同步信号量empty(n)-------代表空闲缓冲区可以放入n和产品,初始为n2.消费者在缓冲区不空的情况下可以放入;设定一个同步信号量full(0)------代表缓冲区已有的产品数量,初始为03. 缓冲区是共享资源,需要加锁访问;除了同步互斥关系原创 2020-06-28 11:57:53 · 1702 阅读 · 2 评论 -
c++多线程thread操作(五)unique_lock加锁
(一)加锁的三种方式:1. mutex原生:mutex<int>mu;mu.lock();// ...执行代码段mu.unlock();优点:可以解决数据竞争;缺点:如果执行代码段抛出异常,mu锁将永远被锁住,无法释放;2. lock_guard加锁mutex<int>mu;lock_guard<mutex> guard(mu);// guard析构时自动释放锁// ...执行代码段优点:可以解决mutex原生下的异常问题,gua原创 2020-06-28 11:21:19 · 3647 阅读 · 0 评论 -
c++多线程thread操作(四)死锁的问题和解决
1. 死锁问题的出现,出现了循环调用,并且抢占了资源。class LofFile {private: mutex m_mutex1; mutex m_mutex2;public: LofFile() {} void shared_print(string msg, int id) { lock_guard<mutex> guard1(m_mutex1); lock_guard<mutex> guard2(m_mutex2); cout <<原创 2020-06-28 00:27:45 · 1334 阅读 · 0 评论 -
c++多线程thread操作(三)数据竞争互斥访问
1. 数据竞争问题:对共享资源的访问会出现杂乱无序的结果void shared_print(string msg, int id) { cout << "From" << id << " : " << msg << endl;// cout是可竞争资源, 需要同步cout}void func_1() { for (int i = 0; i > -5; i--) { shared_print("From t1: ",i)原创 2020-06-28 00:15:05 · 1572 阅读 · 0 评论 -
c++多线程thread操作(二)线程管理
线程管理1. 先看最简单的线程实现案例:void func_1() { cout << "hello linger" << endl;}int main() { thread t1(func_1); // t1 与主线程互不影响 for (int i = 0; i < 10; i++) { // 万一它出现异常就没法join了 cout << "from main:" << i << endl; } t.原创 2020-06-27 23:53:05 · 1490 阅读 · 0 评论 -
c++多线程thread操作(一)环境部署
案例一:运行环境:Windows 10 需要在c++11的标准下运行;devc++ 打开c++11的方法:Tools ==> Compiler Options;在第一个文本编辑器下输入-std=c++11测试运行thread库:#include <iostream>#include <thread>using namespace std;void func_1(){ cout << "hello linger" << e..原创 2020-06-27 23:32:25 · 1368 阅读 · 0 评论