Я пытаюсь блокировать mutex с независимыми потоками. Требование состоит в том, что у меня много потоков, которые будут запускаться независимо и получать доступ/обновлять общий ресурс. Чтобы убедиться, что рекурсия обновлена с помощью одной задачи, я использовал мьютекс. Однако это не работает.Использование std :: thread с std :: 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
Я хочу знать, если использование от <thread> .detach() Правильно выше? Если я использую .join(), он работает, но я хочу, чтобы каждый поток работал независимо и не дождался завершения потока. Я также хочу знать, что является лучшим способом достижения вышеуказанной логики.
Когда вы вернетесь из 'main()', процесс завершится, поэтому любая работа, еще не законченная в потоках, не будет завершена. Ожидание их с помощью 'join()' является прекрасной вещью для 'main()', чтобы сделать, прежде чем она вернется. –
* * * * * * * * * * * * * * * * * * * * * * * * * кажется. Попытайтесь сделать это с чем-то управляемым; (например, 3). И вы не дожидаетесь своих потоков, поэтому, как только вы закончите, потоки «main()« завершаются », заканчивая ваш процесс; вероятно, * не *, что вы хотите. Для этого я бы предложил, чтобы нить-отсос был неправильным. Скорее вы должны навязать их в 'std :: vector <>', а затем присоединить их * все * до того, как 'main()' завершает. – WhozCraig
@MichaelBurr благодарит за комментарий. Итак, если я использую .join(), будет ли каждый поток работать независимо или ждать завершения предыдущего потока? Мое требование состоит в том, чтобы каждый поток работал независимо. Спасибо за вашу помощь. – programmer