Многопоточная блокирока
От: CyberRussia  
Дата: 16.10.17 12:11
Оценка:
Добрый день,
В многопоточном приложении часть кода закрыта оператором lock.
private object lockObject = new object();
...
public void Method1(){
lock(lockObject){
...
}
}

public void Method2(){
??? if(lockObject){...}???
}

Как снаружи блока не обращаясь непосредственно к нему другим потоком узнать заблокирован он или нет?
Re: Многопоточная блокирока
От: Muxa  
Дата: 16.10.17 12:28
Оценка: 5 (1)
https://msdn.microsoft.com/en-us/library/4tssbxcw(v=vs.110).aspx
var lockObj = new Object();

if (Monitor.TryEnter(lockObj)) {
   try {
      // The critical section.
   }
   finally {
      // Ensure that the lock is released.
      Monitor.Exit(lockObj);
   }
}
else {
   // The lock was not axquired.
}
https://thiscatdoesnotexist.com/
Re: Многопоточная блокирока
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 16.10.17 17:23
Оценка:
Здравствуйте, CyberRussia, Вы писали:

CR>В многопоточном приложении часть кода закрыта оператором lock.

CR>
private object lockObject = new object();
CR>...
CR>public void Method1(){
CR>lock(lockObject){
CR>...
CR>}
CR>}

CR>public void Method2(){
CR>??? if(lockObject){...}???
CR>}
CR>

CR>Как снаружи блока не обращаясь непосредственно к нему другим потоком узнать заблокирован он или нет?

Если я все правильно понял, то: System.Threading.Monitor.IsEntered(lockObject)

Этот метод появился в FW 4.5
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: Многопоточная блокирока
От: Muxa  
Дата: 16.10.17 18:59
Оценка: +1
КД>Если я все правильно понял, то: System.Threading.Monitor.IsEntered(lockObject)
Вернет true если текущий поток держит лок. Насколько я понял ТС, ему нужно не это.
Хотя, могу ошибаться. Формулировка вопроса не совсем ясная.
https://thiscatdoesnotexist.com/
Re[3]: Многопоточная блокирока
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 16.10.17 19:12
Оценка:
Здравствуйте, Muxa, Вы писали:

КД>>Если я все правильно понял, то: System.Threading.Monitor.IsEntered(lockObject)

M>Вернет true если текущий поток держит лок. Насколько я понял ТС, ему нужно не это.
M>Хотя, могу ошибаться. Формулировка вопроса не совсем ясная.

Да, точно.

Я на это (то что это про текущий поток) не обратил внимание, когда смотрел название метода в своем коде

  Который вот:
#if    (BUILD_CONF__NET3_5)
#elif  (BUILD_CONF__NET4)
#elif  (BUILD_CONF__NET4_5)
# define LOCAL_BUILD_CONF__Monitor_has_IsEntered
#elif  (BUILD_CONF__NET4_5_1)
# define LOCAL_BUILD_CONF__Monitor_has_IsEntered
#elif  (BUILD_CONF__NET4_6_0)
# define LOCAL_BUILD_CONF__Monitor_has_IsEntered
#elif  (BUILD_CONF__NET4_6_2)
# define LOCAL_BUILD_CONF__Monitor_has_IsEntered
#else
# error Unknown Target Platform!
#endif

//------------------------------------------------------------------------
using System;
using System.Threading;
using System.Diagnostics;

namespace lcpi.data.oledb.structure{
////////////////////////////////////////////////////////////////////////////////
//class Structure_MTGuard

sealed class Structure_MTGuard
{
 public Structure_MTGuard()
 {;}

 //-----------------------------------------------------------------------
 [Conditional("DEBUG")]
 public void Debug__CheckLockInCurrentThread()
 {
#if LOCAL_BUILD_CONF__Monitor_has_IsEntered
  Debug.Assert(Monitor.IsEntered(this));
#endif
 }//Debug__CheckLockInCurrentThread
};//class Structure_MTGuard

////////////////////////////////////////////////////////////////////////////////
}//namespace lcpi.data.oledb.structure
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: Многопоточная блокирока
От: CyberRussia  
Дата: 16.10.17 20:33
Оценка:
Здравствуйте, Muxa, Вы
M>Хотя, могу ошибаться. Формулировка вопроса не совсем ясная.

Есть как минимум два потока. Один работает с методом внутренность которого закрыта оператором lock от третьего, четвертого... потоков. В первом потоке может возникнуть ситуация, когда нужно знать заблокировал второй поток блок кода или нет. Если в двух словах, если занят — немного подождать освобождение. Но! Поскольку заблокированный код теоретически может зависнуть сильно надолго (работа с внешними удаленными сервисами), а первый долго ждать не может, то вариант с семафором ожидания не подходит. Другое "но" из первого потока метод с блокировкой НЕ запускается, нужно лишь знать о состоянии второго потока.
Re[4]: Многопоточная блокирока
От: samius Россия http://sams-tricks.blogspot.com
Дата: 16.10.17 20:51
Оценка:
Здравствуйте, CyberRussia, Вы писали:

CR>Здравствуйте, Muxa, Вы

M>>Хотя, могу ошибаться. Формулировка вопроса не совсем ясная.

CR>Но! Поскольку заблокированный код теоретически может зависнуть сильно надолго (работа с внешними удаленными сервисами)

Вот это сама по себе проблема — работать с внешними сервисами из под локального лока. Особенно, если внешние сервисы работают с чем-то еще.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.