C++多线程编程和同步机制实例演示

 更新时间:2023年09月03日 15:30:59   作者:小万哥  
C++中的多线程编程和同步机制使得程序员可以利用计算机的多核心来提高程序的运行效率和性能,本文将介绍多线程编程和同步机制的基本概念和使用方法

多线程编程基础

在C++中,使用<thread>库来创建和管理线程。线程可以通过函数、成员函数或者Lambda表达式来实现。

以下是一个使用Lambda表达式来创建线程的例子:

#include <thread>
#include <iostream>
int main() {
    std::thread t([](){
        std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
    });
    t.join();
    return 0;
}

上述代码创建了一个线程并输出了该线程的ID。在创建线程时,需要将线程函数作为参数传递给std::thread

在上述例子中,我们使用了Lambda表达式来定义线程函数,该表达式会输出一行文本。

同步机制

多线程编程中最常见的问题是数据竞争和死锁。为了避免这些问题,我们需要使用同步机制来控制线程的访问。

互斥量

互斥量是C++中最常用的同步机制之一。互斥量可以保证同一时间只有一个线程可以访问共享资源。

以下是一个使用互斥量来保护共享资源的例子:

#include <thread>
#include <mutex>
#include <iostream>
std::mutex mtx;
void thread_func() {
    mtx.lock();
    std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
    mtx.unlock();
}
int main() {
    std::thread t1(thread_func);
    std::thread t2(thread_func);
    t1.join();
    t2.join();
    return 0;
}

上述代码创建了两个线程,并使用互斥量来保护共享资源。在线程函数中,我们先调用mtx.lock()函数来锁定互斥量,然后访问共享资源,最后再调用mtx.unlock()函数来释放互斥量。

在上述例子中,我们使用了两个线程来访问共享资源,但是只有一个线程可以访问该资源。

这是因为在一个线程访问共享资源时,该资源会被锁定,其他线程无法访问该资源,直到该线程释放互斥量为止。

条件变量

条件变量是C++中另一个常用的同步机制。条件变量可以让线程在某些条件满足时才继续执行,否则就等待。

以下是一个使用条件变量来同步线程的例子:

#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void consumer() {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [](){ return ready; });
    std::cout << "Hello from consumer thread " << std::this_thread::get_id() << std::endl;
}
void producer() {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    ready = true;
    cv.notify_one();
}
int main() {
    std::thread t1(consumer);
    std::thread t2(producer);
    t1.join();
    t2.join();
    return 0;
}

上述代码创建了两个线程,一个生产者线程和一个消费者线程。生产者线程在1秒后将ready变量设置为true,然后通知消费者线程继续执行。

消费者线程等待条件变量cv,直到ready变量的值为true为止。

在该例子中,我们使用了条件变量来同步生产者和消费者线程。

结论

多线程编程和同步机制是C++中非常重要的主题。本文介绍了多线程编程的基本概念和使用方法,以及互斥量和条件变量等常用的同步机制。

希望这篇文章对你有所帮助,更多关于C++多线程同步机制的资料请关注脚本之家其它相关文章!

相关文章

  • 解析C++无锁队列的实现代码

    解析C++无锁队列的实现代码

    本篇文章是对C++无锁队列的实现进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Java C++ 题解leetcode1619删除某些元素后数组均值

    Java C++ 题解leetcode1619删除某些元素后数组均值

    这篇文章主要为大家介绍了Java C++ 题解leetcode1619删除某些元素后数组均值示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 浅谈C++中各种不同意义的new和delete的使用

    浅谈C++中各种不同意义的new和delete的使用

    本文主要介绍了浅谈C++中各种不同意义的new和delete的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C++日期与时间 chrono库介绍及使用教程

    C++日期与时间 chrono库介绍及使用教程

    chrono库是C++11中的一个标准库,它提供了一系列与时间相关的类和函数,用于表示和处理时间间隔,时钟和时间点,C++20新增Calendar,这篇文章主要介绍了C++日期与时间 chrono库介绍及使用,需要的朋友可以参考下
    2023-12-12
  • C++实现十六进制字符串转换成int整形值的示例

    C++实现十六进制字符串转换成int整形值的示例

    今天小编就为大家分享一篇关于C++实现十六进制字符串转换成int整形值的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++中虚函数与纯虚函数的用法

    C++中虚函数与纯虚函数的用法

    这篇文章主要介绍了C++中虚函数与纯虚函数的用法,是非常重要的概念,需要的朋友可以参考下
    2014-08-08
  • C++ 中私有继承的作用

    C++ 中私有继承的作用

    这篇文章主要介绍了C++ 中私有继承的作用的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • C++ 内联函数详解

    C++ 内联函数详解

    内联函数是c++为了提高程序的运行速度做的改进,本片文章详细介绍了C++ 的内联函数,本文就来详细的介绍一下,感兴趣的朋友可以了解一下
    2021-11-11
  • 详解C语言中的符号常量、变量与算术表达式

    详解C语言中的符号常量、变量与算术表达式

    这篇文章主要介绍了C语言中的符号常量、变量与算术表达式,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • 详解C++ 桶排序(BucketSort)

    详解C++ 桶排序(BucketSort)

    这篇文章主要介绍了C++桶排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论