2014-09-25 3 views
0

У меня есть две функции: Funct1 и Funct2. Они оба внутренне звонят Funct3. Funct 1 и Funct2 вызывается двумя разными потоками.Заблокировать несколько функций, выполняемых различными потоками

То, что я хочу, когда Funct1 находится в процессе по Thread1, то Func2 не должен вызываться Thread2, или в основном Funct3 не следует называть обеими нитями одновременно.

Если я использую семафор в обоих Funct1 и Funct2, и исполнение Funct1 начинается, тогда этот мьютекс запрещает Funct2 начать?

Что должно быть сделано в такой ситуации? Вот пример кода:

class A 
{ 
boost::mutex mtx; 
public: 
     void Func1() 
     { 
      boost::mutex::scoped_lock lock(this->mtx); 
      /* -------- */ 
      Func3(); 
     } 
     void Func2() 
     { 
      boost::mutex::scoped_lock lock(this->mtx); 
      /* --------- */ 
      Func3(); 
     } 
     void Func3() 
     { 
      //do something 
     } 
    }; 
+0

Мьютексы имеют смысл только в том случае, если кодовый блок, доступ к которому выполняется (выполняется) более чем одним потоком. В вашем случае кажется, что Func3 - это единственное место, которое выполняется обоими потоками. Почему вы не вставляете 'lock' в Func3? – 9dan

+0

Нет, Func1 также выполняется 10 потоками, а Func2 работает в другом потоке. – garima721

ответ

0

Если Func1() может быть вызван из нескольких потоков и работать бесплатно параллельно до тех пор, func2 не работает и Func2() может работать только тогда, когда нет Func1() не не работает, то вам, вероятно, нужна общая блокировка. Func1 должен получить общие блокировки перед запуском, а Func2 должен получить эксклюзивную блокировку перед запуском. Это классика многих читателей, одна проблема писателя.

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