服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++中标准线程库的基本使用介绍

C++中标准线程库的基本使用介绍

2022-09-09 14:58码农飞飞 C/C++

大家好,本篇文章主要讲的是C++中标准线程库的基本使用介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

Qt的封装程度比较高的线程类用多了,发现C++标准库里面的线程库有些生疏。这里总结一下C++标准库里面的线程相关内容,供大家参考使用。其实标准C++的线程库也是挺好用的。

1.创建线程异步执行

我们可以通过async函数直接异步创建一个线程,这种方法相对来说比较简单,线程执行的结果可以直接用future<T>来进行获取。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <future>
 
//线程对应的函数
bool thread_func(int x) {
    return true;
}
int main()
{
    int inputNum = 65547;
    std::future<bool> future = std::async(thread_func, inputNum);
    bool ret = future.get();
    getchar();
}

2.通过使用互斥锁防止线程冲突

线程间同步读取内容的话一般不会出现线程安全问题,但如果线程间同步写同一个内容的话就容易出现冲突。比如每个线程执行一次,就会给全局执行次数累加一次,如果多个线程同时执行操作,在写的时候没有加锁,这就有可能导致执行次数被重复累加的情况。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
 
int count=0;
 
void print_block(int n) {
    mtx.lock();
   count++;
    //do somethings
    mtx.unlock();
}
int main()
{
    std::thread thread1(print_block, 50);
    std::thread thread2(print_block, 50);
 
    thread1.join();
    thread2.join();
    getchar();
    return 0;
}

3.采用信号量控制线程的运行

条件变量(condition_variable)用来控制线程的运行,线程启动的时候如果条件变量等待,会阻塞线程的运行,直到条件变量发送对应的通知线程才能开始运行。通过采用条件变量我们可以控制线程的运行,避免线程空运行消耗计算资源。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
 
std::mutex mtx;
std::condition_variable cv;
 
void print_id(int id) {
    std::unique_lock<std::mutex> lck(mtx);
    cv.wait(lck);
    std::cout << "thread " << id << '\n';
}
void go() {
    std::unique_lock<std::mutex> lck(mtx);
    cv.notify_all();
}
int main()
{
    std::thread threads[10];
    for (int i = 0; i < 10; ++i)
        threads[i] = std::thread(print_id, i);
   std::cout << "start thread run" << std::endl;
    go();
    for (auto& th : threads){th.join();}
    getchar();
    return 0;
}

4.通过promise实现进程间通信

很多时候线程间执行是有先后顺序的,我们需要等待上一个线程执行结束拿到结果之后再执行当前线程,这时候就涉及到线程间的等待和数据传递这时候std::promise<T>就能排上用场了,通过使用该变量我们可以很轻松的实现线程间的等待和数据传递。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <future>
#include <chrono>
void Thread_Fun1(std::promise<int> &p)
{
    std::this_thread::sleep_for(std::chrono::seconds(5));
    int iVal = 233;
    std::cout << "传入数据(int):" << iVal << std::endl;
    p.set_value(iVal);
}
 
void Thread_Fun2(std::future<int> &f)
{
    //阻塞函数,直到收到相关联的std::promise对象传入的数据
    auto iVal = f.get();
    std::cout << "收到数据(int):" << iVal << std::endl;
}
 
int main()
{
    std::promise<int> pr1;
    std::future<int> fu1 = pr1.get_future();
 
    std::thread t1(Thread_Fun1, std::ref(pr1));
    std::thread t2(Thread_Fun2, std::ref(fu1));
 
    //阻塞至线程结束
    t1.join();
    t2.join();
    return 1;
}

总结

到此这篇关于C++中标准线程库的基本使用介绍的文章就介绍到这了,更多相关C++标准线程库内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/yang1fei2/article/details/122795939

延伸 · 阅读

精彩推荐
  • C/C++探究c++虚表实现代码

    探究c++虚表实现代码

    虚表是一种利用程序语言实现的dynamic dispatch机制,或者说runtime method binding机制,也就是我们说的多态。本文简单探究虚表实现方法,一起看看吧...

    不会写代码的丝丽4872022-01-04
  • C/C++C语言递归系列的深入总结

    C语言递归系列的深入总结

    这篇文章主要给大家总结介绍了关于C语言递归系列的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    daener7622021-10-21
  • C/C++C++设计模式之装饰模式(Decorator)

    C++设计模式之装饰模式(Decorator)

    这篇文章主要为大家详细介绍了C++设计模式之装饰模式Decorator的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    chencarl8552021-06-23
  • C/C++c++遍历lua table示例

    c++遍历lua table示例

    这篇文章主要介绍了c++遍历lua table示例,需要的朋友可以参考下...

    C++教程网12132021-01-19
  • C/C++Qt中树形控件Tree Widget的使用方法汇总

    Qt中树形控件Tree Widget的使用方法汇总

    最近小编在研究Tree Widget树形控件的相关知识,这种控件其实有时还是很有用处的,我主要利用的是带有复选框的树形控件,下面通过实例代码给大家介绍...

    BOO20186092022-03-06
  • C/C++Windows程序内部运行机制实例详解

    Windows程序内部运行机制实例详解

    这篇文章主要介绍了Windows程序内部运行机制实例详解,对于学习Windows程序设计来说是非常重要的一课,需要的朋友可以参考下...

    C语言程序设计8932021-01-27
  • C/C++C++ 汉诺塔问题知识点总结

    C++ 汉诺塔问题知识点总结

    在本篇文章里小编给大家整理的是关于C++ 汉诺塔问题知识点内容,有需要的朋友们可以参考下。...

    000紫外线0008502021-08-17
  • C/C++C++中发声函数Beep用法

    C++中发声函数Beep用法

    本文给大家分享的是Beep函数的用法以及会使扬声器发出简单的声音的示例,有需要的小伙伴可以参考下...

    zhcs4702021-05-10