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

C++ 多线程处理同一块 buffer:示例代码与解释

原文地址: https://www.cveoy.top/t/topic/pQPn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录