启动多个线程处理同一块buffer等所哟线程处理完成后释放buffer给出C++示例代码
下面是一个使用C++11的示例代码,展示了如何启动多个线程处理同一块buffer,并在所有线程处理完成后释放buffer。
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
std::mutex mtx; // 互斥锁,用于保护对buffer的访问
void processBuffer(int* buffer, int bufferSize, int threadId) {
for (int i = 0; i < bufferSize; ++i) {
// 模拟处理buffer的过程
std::this_thread::sleep_for(std::chrono::milliseconds(100));
// 使用互斥锁保护对buffer的访问
std::lock_guard<std::mutex> lock(mtx);
std::cout << "Thread " << threadId << ": Processing element " << i << std::endl;
buffer[i] *= 2; // 修改buffer中的元素
}
}
int main() {
const int bufferSize = 10;
int buffer[bufferSize] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<std::thread> threads;
// 创建多个线程处理buffer
for (int i = 0; i < 5; ++i) {
threads.emplace_back(processBuffer, buffer, bufferSize, i);
}
// 等待所有线程完成
for (auto& thread : threads) {
thread.join();
}
// 打印处理后的buffer
std::cout << "Processed buffer elements: ";
for (int i = 0; i < bufferSize; ++i) {
std::cout << buffer[i] << " ";
}
std::cout << std::endl;
return 0;
}
在上面的代码中,我们使用了std::mutex来保护对buffer的访问,以防止多个线程同时修改buffer导致竞争条件。通过std::lock_guard来自动管理互斥锁的上锁和解锁。
首先,我们定义了一个processBuffer函数,它接受一个指向buffer的指针、buffer的大小和线程ID作为参数。在该函数中,我们使用一个循环来模拟处理buffer的过程,并在每次处理一个元素时打印线程ID和元素的索引。注意,在访问和修改buffer之前,我们使用互斥锁对其进行了上锁,以确保线程安全。
在main函数中,我们创建了一个长度为10的buffer,并将其分配给多个线程进行处理。我们使用std::vector<std::thread>来保存所有线程的引用,然后使用emplace_back方法在vector末尾添加线程对象。
最后,我们使用join方法等待所有线程完成,并打印处理后的buffer的元素。
运行该代码,你将看到类似以下输出:
Thread 0: Processing element 0
Thread 1: Processing element 0
Thread 2: Processing element 0
Thread 3: Processing element 0
Thread 4: Processing element 0
Thread 0: Processing element 1
Thread 1: Processing element 1
Thread 2: Processing element 1
Thread 3: Processing element 1
Thread 4: Processing element 1
...
Processed buffer elements: 2 4 6 8 10 12 14 16 18 20
注意:在实际应用中,你可能还需要考虑其他细节,如线程安全的资源管理和异常处理等。这里的示例代码仅为了演示基本的多线程处理和互斥锁的使用
原文地址: http://www.cveoy.top/t/topic/h7ZV 著作权归作者所有。请勿转载和采集!