在Linux下使用C++進行并發編程,通常會用到線程庫 <thread>
、互斥鎖 <mutex>
、條件變量 <condition_variable>
等。以下是一些基本的步驟和示例代碼,幫助你開始使用C++進行并發編程。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <vector>
使用 std::thread
類來創建線程。
void threadFunction(int id) {
std::cout << "Thread " << id << " is running\n";
}
int main() {
std::vector<std::thread> threads;
for (int i = 0; i < 5; ++i) {
threads.emplace_back(threadFunction, i);
}
for (auto& t : threads) {
t.join();
}
return 0;
}
使用 std::mutex
來保護共享數據,防止數據競爭。
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int sharedData = 0;
void incrementSharedData() {
std::lock_guard<std::mutex> lock(mtx); // 自動管理鎖
++sharedData;
}
int main() {
std::vector<std::thread> threads;
for (int i = 0; i < 10; ++i) {
threads.emplace_back(incrementSharedData);
}
for (auto& t : threads) {
t.join();
}
std::cout << "Shared data: " << sharedData << "\n";
return 0;
}
使用 std::condition_variable
來進行線程間的同步。
#include <iostream>
#include <thread>
#include <mutex>
#include <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; });
std::cout << "Worker thread is processing data\n";
}
void trigger() {
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 worker(workerThread);
std::thread triggerThread(trigger);
worker.join();
triggerThread.join();
return 0;
}
對于簡單的數據類型,可以使用 std::atomic
來避免鎖的開銷。
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> sharedData(0);
void incrementSharedData() {
++sharedData;
}
int main() {
std::vector<std::thread> threads;
for (int i = 0; i < 10; ++i) {
threads.emplace_back(incrementSharedData);
}
for (auto& t : threads) {
t.join();
}
std::cout << "Shared data: " << sharedData << "\n";
return 0;
}
以上是一些基本的并發編程概念和示例代碼。在實際應用中,你可能需要處理更復雜的并發場景,例如線程池、任務隊列、讀寫鎖等。C++標準庫提供了豐富的工具來幫助你進行并發編程,合理使用這些工具可以提高程序的性能和可靠性。