千家信息网

C++中标准线程库怎么使用

发表于:2024-11-18 作者:千家信息网编辑
千家信息网最后更新 2024年11月18日,本文小编为大家详细介绍"C++中标准线程库怎么使用",内容详细,步骤清晰,细节处理妥当,希望这篇"C++中标准线程库怎么使用"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1
千家信息网最后更新 2024年11月18日C++中标准线程库怎么使用

本文小编为大家详细介绍"C++中标准线程库怎么使用",内容详细,步骤清晰,细节处理妥当,希望这篇"C++中标准线程库怎么使用"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1.创建线程异步执行

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

#include #include  //线程对应的函数bool thread_func(int x) {        return true;}int main(){        int inputNum = 65547;        std::future future = std::async(thread_func, inputNum);        bool ret = future.get();        getchar();}

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

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

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

#include #include #include #include  std::mutex mtx;std::condition_variable cv; void print_id(int id) {        std::unique_lock lck(mtx);        cv.wait(lck);        std::cout << "thread " << id << '\n';}void go() {        std::unique_lock 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就能排上用场了,通过使用该变量我们可以很轻松的实现线程间的等待和数据传递。

#include #include #include void Thread_Fun1(std::promise &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 &f){        //阻塞函数,直到收到相关联的std::promise对象传入的数据        auto iVal = f.get();        std::cout << "收到数据(int):" << iVal << std::endl;} int main(){        std::promise pr1;        std::future 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++中标准线程库怎么使用"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

0