当前位置: 首页 > article >正文

C++服务器端开发(7):并发处理

并发处理的方式包括线程、互斥锁、条件变量和原子操作。

1.线程:C++11 引入了标准线程库,可以通过 std::thread 类来创建和管理线程。通过在不同的线程中执行不同的任务,可以实现并发处理。

#include <iostream>
#include <thread>

void foo()
{
    std::cout << "Thread 1" << std::endl;
}

void bar(int x)
{
    std::cout << "Thread 2: " << x << std::endl;
}

int main()
{
    std::thread t1(foo);
    std::thread t2(bar, 42);

    t1.join();
    t2.join();

    return 0;
}

2.互斥锁:C++11 中的 std::mutex 类提供了互斥锁的功能,可以用来保护共享资源,在多个线程中安全地访问和修改共享数据。

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;

void func(int x)
{
    std::lock_guard<std::mutex> lock(mtx);

    std::cout << "Thread " << x << std::endl;
}

int main()
{
    std::thread t1(func, 1);
    std::thread t2(func, 2);

    t1.join();
    t2.join();

    return 0;
}

3.条件变量:C++11 中的 std::condition_variable 类用于线程之间的同步和通信。可以用条件变量来等待某个条件满足后再继续执行。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void worker()
{
    {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, []{ return ready; });
        std::cout << "Thread 1" << std::endl;
    }
}

void signaler()
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    {
        std::lock_guard<std::mutex> lock(mtx);
        ready = true;
    }
    cv.notify_one();
}

int main()
{
    std::thread t1(worker);
    std::thread t2(signaler);

    t1.join();
    t2.join();

    return 0;
}

4.原子操作:C++11 中的 std::atomic 类用于实现原子操作,保证在多线程环境下对共享数据的操作是原子的,不会被其他线程打断。

#include <iostream>
#include <thread>
#include <atomic>

std::atomic<int> counter(0);

void increment()
{
    for (int i = 0; i < 1000000; ++i)
    {
        counter.fetch_add(1);
    }
}

void decrement()
{
    for (int i = 0; i < 1000000; ++i)
    {
        counter.fetch_sub(1);
    }
}

int main()
{
    std::thread t1(increment);
    std::thread t2(decrement);

    t1.join();
    t2.join();

    std::cout << "Counter: " << counter << std::endl;

    return 0;
}

http://www.kler.cn/news/232821.html

相关文章:

  • FolkMQ “单线程“消息中间件(开源) v1.0.32 发布
  • 【笔记】Helm-5 Chart模板指南-8 命名模板
  • 排序算法---堆排序
  • CTF--Web安全--SQL注入之‘绕过方法’
  • 基于ISO13400 (DoIP) 实现车辆刷写
  • 网络编程..
  • 突然,有点不喜欢梅西了
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Span组件
  • 【QT学习十四】 文件目录操作
  • 自然语言NLP
  • 适用于 Windows 的 6 款 iPhone 数据恢复软件
  • 基于微信小程序的新生报到系统的研究与实现,附源码
  • 医学考试搜题答案这7款足够解决问题 #笔记#知识分享#其他
  • SpringBoot源码解读与原理分析(六)WebMvc场景的自动装配
  • 507. Perfect Number(完美数)
  • Python循环语句——for循环临时变量作用域
  • SSL和Kerberos身份验证的区别?
  • 【开源】基于JAVA+Vue+SpringBoot的智慧社区业务综合平台
  • 数学建模-灰色预测最强讲义 GM(1,1)原理及Python实现
  • 【证书管理】实验报告
  • Java-spring注解的作用
  • 初始web服务器(并基于idea来实现无需下载的tomcat)
  • 软考 系统分析师系列知识点之信息系统战略规划方法(4)
  • 【Linux】进程学习(二):进程状态
  • 基于LightGBM的回归任务案例
  • VUE学习之路——列表渲染
  • 【django】建立python虚拟环境-20240205
  • 【学网攻】 第(24)节 -- 帧中继(点对点)
  • PlantUML绘制UML图教程
  • Java 学习和实践笔记(2)