商城首页欢迎来到中国正版软件门户

您的位置:首页 >C++程序在Ubuntu如何实现并发控制

C++程序在Ubuntu如何实现并发控制

  发布于2026-05-02 阅读(0)

扫一扫,手机访问

在Ubuntu上使用C++实现并发控制

想在Ubuntu环境下玩转C++并发编程?这事儿说复杂也复杂,说简单也简单。自从C++11标准引入了库,创建和管理线程就变得直观多了。当然,光有线程还不够,要管好它们、避免争抢资源,还得请出几位“帮手”:互斥锁()、条件变量()、原子操作()等同步机制,它们共同构成了并发控制的工具箱。

理论说了不少,不如来看个实实在在的例子。下面这段代码,就展示了如何用来搞定最基本的并发控制:

#include 
#include 
#include 

std::mutex mtx; // 创建一个互斥锁

void print_block(int n, char c) {
    mtx.lock(); // 加锁
    for (int i = 0; i < n; ++i) {
        std::cout << c;
    }
    std::cout << '\n';
    mtx.unlock(); // 解锁
}

int main() {
    std::thread th1(print_block, 50, '*');
    std::thread th2(print_block, 50, '$');

    th1.join(); // 等待线程th1完成
    th2.join(); // 等待线程th2完成

    return 0;
}

这个例子的逻辑很清晰:我们定义了一个print_block函数来打印字符。关键点在于,如果没有那把std::mutex锁,两个线程同时往控制台输出,结果很可能乱成一团。互斥锁的作用,就是确保打印这个“关键区域”一次只对一个线程开放,从而保证了输出的有序性。

不过,std::mutex只是同步原语家族的一员。C++标准库还提供了其他几位得力干将,各有各的适用场景:

  • std::lock_guard:这位是“懒人福音”,采用RAII风格,构造时自动加锁,析构时自动解锁,再也不用担心忘记解锁了。
  • std::unique_lock:比lock_guard更灵活,支持延迟锁定、定时锁定甚至递归锁定,功能更强大。
  • std::condition_variable:线程间的“信号灯”,专门处理等待和通知的场景,让线程协作更顺畅。
  • std::atomic:针对简单数据类型(如整型、指针)的“无锁”高手,能在不加互斥锁的前提下保证操作的原子性,性能通常更高。

纸上谈兵终觉浅,我们再看一个结合了std::lock_guardstd::condition_variable的进阶例子:

#include 
#include 
#include 
#include 

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

void print_id(int id) {
    std::unique_lock lck(mtx);
    cv.wait(lck, []{return ready;}); // 等待直到ready为true
    std::cout << "Thread " << id << '\n';
}

void go() {
    std::lock_guard lck(mtx);
    ready = true;
    cv.notify_all(); // 通知所有等待的线程
}

int main() {
    std::thread threads[10];
    // spawn 10 threads:
    for (int i = 0; i < 10; ++i)
        threads[i] = std::thread(print_id, i);

    std::cout << "10 threads ready to race...\n";
    go(); // go!

    for (auto &th : threads) th.join();
    return 0;
}

这个场景模拟了“运动员等待发令枪”的过程:10个线程(运动员)创建后,都在条件变量上等待。主线程(发令员)调用go函数,将ready标志置为true,并调用cv.notify_all()发出“枪响”。所有等待的线程收到通知后,才继续执行打印自身ID的操作。这种模式在生产者-消费者等经典并发模型中非常有用。

最后,别忘了怎么把它们变成可执行程序。编译上述代码时,你需要一个支持C++11或更高标准的编译器(比如g++),并在命令行中加上相应的标志:

g++ -std=c++11 -pthread your_program.cpp -o your_program

这里有两个关键点:-std=c++11告诉编译器启用C++11特性;而-pthread标志则是必须的,它不仅会链接POSIX线程库,还会定义必要的预处理器宏(如_REENTRANT),确保多线程相关功能正常工作。把这步做好,你的并发程序就能在Ubuntu上顺利跑起来了。

本文转载于:https://www.yisu.com/ask/83586533.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注