Я пытаюсь заблокировать mutex с независимыми потоками. Требование состоит в том, что у меня есть много потоков, которые будут работать независимо и получать доступ / обновлять общий ресурс. Чтобы убедиться, что ресурс обновляется с помощью одной задачи, я использовал mutex. Однако это не работает.
Я вставил код, представление того, что я пытаюсь сделать ниже:
#include <iostream>
#include <map>
#include <string>
#include <chrono>
#include <thread>
#include <mutex>
#include <unistd.h>std::mutex mt;
static int iMem = 0;
int maxITr = 1000;void renum()
{
// Ensure that only 1 task will update the variable
mt.lock();
int tmpMem = iMem;
usleep(100); // Make the system sleep/induce delay
iMem = tmpMem + 1;
mt.unlock();
printf("iMem = %d\n", iMem);
}
int main()
{
for (int i = 0; i < maxITr; i++) {
std::thread mth(renum);
mth.detach(); // Run each task in an independent thread
}
return 0;
}
но это заканчивается с ошибкой ниже:
terminate called after throwing an instance of 'std::system_error'
what(): Resource temporarily unavailable
Я хочу знать, если использование <нить>.detach () правильно выше? Если я использую .join (), это работает, но я хочу, чтобы каждый поток работал независимо и не ждал завершения потока.
Я также хочу знать, каков наилучший способ достижения вышеуказанной логики.
Попробуй это:
int main()
{
std::vector<std::thread> mths;
mths.reserve(maxITr);
for (int i = 0; i < maxITr; i++) {
mths.emplace_back(renum);
}
for (auto& mth : mths) {
mth.join();
}
}
Таким образом, вы сохраняете контроль над потоками (не вызывая detach()
), и вы можете присоединиться к ним в конце, чтобы вы знали, что они выполнили свои задачи.