在Linux环境下使用C++实现并发控制,通常涉及以下几个方面:
<thread>
库来创建和管理线程。std::mutex
)、条件变量(std::condition_variable
)、原子操作(std::atomic
)等来同步线程间的访问。std::atomic
变量、线程安全的队列等。以下是一个简单的示例,展示了如何在C++中使用std::mutex
和std::lock_guard
来实现互斥锁,从而控制对共享资源的访问:
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
std::mutex mtx; // 全局互斥锁
int shared_resource = 0; // 共享资源
void increment_resource(int iterations) {
for (int i = 0; i < iterations; ++i) {
std::lock_guard<std::mutex> lock(mtx); // 自动管理锁的生命周期
++shared_resource;
}
}
int main() {
const int num_threads = 10;
const int iterations_per_thread = 100000;
std::vector<std::thread> threads;
// 创建多个线程
for (int i = 0; i < num_threads; ++i) {
threads.emplace_back(increment_resource, iterations_per_thread);
}
// 等待所有线程完成
for (auto& t : threads) {
t.join();
}
std::cout << "Final value of shared_resource: " << shared_resource << std::endl;
return 0;
}
在这个示例中,我们创建了多个线程,每个线程都会对一个共享资源进行递增操作。为了防止多个线程同时修改共享资源,我们使用了std::mutex
和std::lock_guard
来确保每次只有一个线程可以访问共享资源。
条件变量:用于线程间的等待和通知机制。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void worker_thread() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return ready; }); // 等待条件变量
// 条件满足后执行操作
std::cout << "Worker thread is processing data\n";
}
void trigger_work() {
std::lock_guard<std::mutex> lock(mtx);
ready = true;
cv.notify_one(); // 通知等待的线程
}
int main() {
std::thread worker(worker_thread);
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟一些准备工作
trigger_work();
worker.join();
return 0;
}
原子操作:用于实现无锁编程。
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> shared_resource(0);
void increment_resource(int iterations) {
for (int i = 0; i < iterations; ++i) {
++shared_resource; // 原子操作
}
}
int main() {
const int num_threads = 10;
const int iterations_per_thread = 100000;
std::vector<std::thread> threads;
for (int i = 0; i < num_threads; ++i) {
threads.emplace_back(increment_resource, iterations_per_thread);
}
for (auto& t : threads) {
t.join();
}
std::cout << "Final value of shared_resource: " << shared_resource << std::endl;
return 0;
}
通过这些机制,可以在Linux环境下使用C++实现高效的并发控制。