您的位置:首页 >C++程序在Ubuntu如何实现并发控制
发布于2026-05-02 阅读(0)
扫一扫,手机访问
想在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_guard和std::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上顺利跑起来了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9