在Linux中使用C++进行并发编程,你可以使用C++11标准库中提供的线程支持库(<thread>
),以及同步原语如互斥锁(<mutex>
)、条件变量(<condition_variable>
)和原子操作(<atomic>
)。以下是一些基本的步骤和示例代码,帮助你开始使用C++进行并发编程。
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
std::thread
类来创建一个新的线程。void helloFunction() {
std::cout << "Hello from a thread!" << std::endl;
}
int main() {
std::thread t(helloFunction);
t.join(); // 等待线程完成
return 0;
}
void greet(std::string name) {
std::cout << "Hello, " << name << " from a thread!" << std::endl;
}
int main() {
std::thread t(greet, "Alice");
t.join();
return 0;
}
std::mutex
来保护共享资源,防止数据竞争。std::mutex mtx; // 全局互斥锁
int shared_data = 0;
void increment() {
mtx.lock(); // 加锁
++shared_data;
mtx.unlock(); // 解锁
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Shared data: " << shared_data << std::endl;
return 0;
}
std::lock_guard
来自动管理锁的生命周期。void increment() {
std::lock_guard<std::mutex> lock(mtx); // 自动加锁和解锁
++shared_data;
}
int main() {
// ... 同上
}
std::condition_variable
来同步线程间的操作。std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void workerThread() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return ready; }); // 等待直到ready为true
// 执行工作...
}
void trigger() {
std::lock_guard<std::mutex> lock(mtx);
ready = true;
cv.notify_all(); // 通知所有等待的线程
}
int main() {
std::thread worker(workerThread);
// ... 做一些准备工作 ...
trigger();
worker.join();
return 0;
}
std::atomic
来进行无需锁的线程安全操作。std::atomic<int> shared_data(0);
void increment() {
++shared_data; // 原子操作
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Shared data: " << shared_data << std::endl;
return 0;
}
这些是C++并发编程的基础。在实际应用中,你可能需要处理更复杂的同步问题,比如读写锁、屏障、future和promise等。随着你对C++并发编程的深入了解,你可以探索这些高级特性来构建更高效和健壮的多线程应用程序。