vector<QString> relationship_list有500个成员 ,启用六个线程,执行relationship.parseData(relationship_list[x],worningcrosstype);,并实时记录已经完成成员数 给出C++代码
时间: 2024-02-18 09:02:23 浏览: 52
一个C++多线程例子
4星 · 用户满意度95%
可以使用C++11中的线程库来实现多线程操作,下面是一个简单的示例代码:
```c++
#include <iostream>
#include <vector>
#include <string>
#include <thread>
#include <mutex>
#include <atomic>
std::mutex mtx; // 互斥锁,用于保护共享变量
std::atomic<int> count(0); // 原子变量,用于记录已完成成员数
void parse_data(const std::string& relationship, const std::string& worningcrosstype)
{
// 执行解析操作,例如:
std::cout << "Parsing data: " << relationship << ", " << worningcrosstype << std::endl;
// 更新已完成成员数
++count;
}
int main()
{
const int member_num = 500;
std::vector<std::string> relationship_list(member_num);
for (int i = 0; i < member_num; ++i) {
relationship_list[i] = std::to_string(i);
}
const int thread_num = 6;
// 创建线程
std::vector<std::thread> threads;
for (int i = 0; i < thread_num; ++i) {
threads.emplace_back([&]() {
while (true) {
// 获取下一个待处理的成员
std::string relationship;
mtx.lock();
if (count < member_num) {
relationship = relationship_list[count];
++count;
}
mtx.unlock();
if (relationship.empty()) {
// 所有成员已处理完成,退出线程
break;
}
// 执行解析操作
parse_data(relationship, "worningcrosstype");
}
});
}
// 等待所有线程执行完成
for (auto& t : threads) {
t.join();
}
std::cout << "All data parsed!" << std::endl;
return 0;
}
```
在上面的代码中,我们首先定义了一个互斥锁`mtx`和一个原子变量`count`,用于保护共享变量`count`,并且在多线程中对其进行修改。然后创建了6个线程,每个线程不断地从`relationship_list`中获取下一个待处理的成员,执行`parse_data`函数,直到所有成员都已处理完成。最后等待所有线程执行完成,输出提示信息。注意,这里使用`std::atomic`定义的原子变量可以避免多线程中对`count`的竞争问题。
阅读全文