2014-10-20 5 views
2

Я пытаюсь блокировать 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(), он работает, но я хочу, чтобы каждый поток работал независимо и не дождался завершения потока. Я также хочу знать, что является лучшим способом достижения вышеуказанной логики.

+0

Когда вы вернетесь из 'main()', процесс завершится, поэтому любая работа, еще не законченная в потоках, не будет завершена. Ожидание их с помощью 'join()' является прекрасной вещью для 'main()', чтобы сделать, прежде чем она вернется. –

+2

* * * * * * * * * * * * * * * * * * * * * * * * * кажется. Попытайтесь сделать это с чем-то управляемым; (например, 3). И вы не дожидаетесь своих потоков, поэтому, как только вы закончите, потоки «main()« завершаются », заканчивая ваш процесс; вероятно, * не *, что вы хотите. Для этого я бы предложил, чтобы нить-отсос был неправильным. Скорее вы должны навязать их в 'std :: vector <>', а затем присоединить их * все * до того, как 'main()' завершает. – WhozCraig

+0

@MichaelBurr благодарит за комментарий. Итак, если я использую .join(), будет ли каждый поток работать независимо или ждать завершения предыдущего потока? Мое требование состоит в том, чтобы каждый поток работал независимо. Спасибо за вашу помощь. – programmer

ответ

3

Попробуйте это:

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()), и вы можете присоединиться к ним все в конце концов, так что вы знаете, что они выполнили свои задачи.

+0

Спасибо. Мне нужно 1 разъяснение. будет ли thread.join() делать каждый taks независимо или все остальные задачи должны ждать завершения основной задачи (.join())? – programmer

+0

Потоки будут разрешены для запуска и завершения независимо, за исключением основного потока, который будет ждать их всех (в частности, он будет ждать окончания 'mths [0]', а затем для 'mths [1]' для завершения и т. д., но, конечно, потоки могли бы быть закончены в любом порядке. –

+0

Вы говорите, что mths [1] будет запускаться только после завершения mths [0], независимо от доступа к общему объекту? Или оба будут работать параллельно, но когда дело доходит до доступа к общему ресурсу (iMem), mths [1] будет ждать mths [0], чтобы освободить блокировку от объекта iMem? – programmer

 Смежные вопросы

  • Нет связанных вопросов^_^