2015-03-15 3 views
-2

Так что я пытаюсь привлечь голову вокруг потоков, используя общие ресурсы. Примеры на C# corner (link 1) и msdn (ссылка 2) предоставляют основные примеры синтаксиса и некоторые теоретические кадрирования, поэтому основная предпосылка блокировки общего ресурса для процесса, который я понимаю. Теперь, мой вопрос:, обеспечивающий блокировки общих ресурсов.

При доступе к нескольким совместно используемым ресурсам в одном и том же кодовом блоке (в псевдокоде) ниже процесса цикла, который выдает URL-адрес из общего стека, оценивает текущий URL-адрес для общего списка уже проверенных URL-адресов, а затем перетаскивает загруженные данные в другой общий стек), мне нужно заключить каждый сегмент кода, относящийся к определенному общему ресурсу в инструкции блокировки?

Похоже, что структура «блокировка (эта) {}» в C# реализует «Монитор» (ссылка 3) в фоновом режиме, а Monitor.Enter и Monitor.Exit оба принимают только один объект в качестве параметра.

Честно говоря, я еще не закодировал это и протестировал его. но мне было интересно об этом, когда я читал, а потом, когда я составлял структуру кода (ниже «псевдокод»). Я капитализировал начальную и конечную точки структуры блокировки, где, как я подозреваю, они были, если мое предположение верно.

Любой, кто может уточнить/подтвердить это для меня?

(Поскольку я еще не приобрел необходимый рейтинг репутации, я разместил ссылки, подобные этому, вы можете найти их внизу; @mods: если я нарушил что-либо, сделав это, сообщите мне, и я изменю сообщение .)

program starts; 

stack (urlsToCheck) is created (static, String); 
list (checkedUrls) is created (static, String); 
stack (unparsedHTML) is created (static, Tuple(string, Byte[]); 

user provides seed url; 
seed url is pushed to top op stack (urlsTocheck); 
thread is created for Crawler method GetData(); 
<!--research possibilities for multiple threads in relation to stack sizes--> 
<!--in case of multiple threads : threadpool + object (crawler) array?--> 
thread is started: 
Crawler 1 is created; 
Crawler 1 starts method GetData: 
loop: 
<!--//check loop for lock/unlock locations//--> 
    Crawler 1 evaluates size of stack (unparsedHTML): 
     if(size > 100): 
      wait 1000 ms; 
      Crawler 1 evaluates size of stack (unparsedHTML); 
     else: 
      continue; 
    LOCK; 
    Crawler 1 evaluates size of stack (urlsToCheck): 
     if(size > 0): 
      Crawler 1 pops url from stack (urlsToCheck); 
      continue; 
     else: 
      wait 1000 ms; 
      Crawler 1 evaluates size of stack (urlsToCheck); 
    Crawler 1 evaluates url for membership in List (checkedUrls): 
     if(membership): 
      discard url; 
      pop url from stack (urlsToCheck); 
      evaluate url for membership in List (checkedUrls); 
     else: 
      continue; 
    UNLOCK; 
    LOCK; 
    Crawler 1 downloads data from url; 
    Crawler makes tuple of url and data; 
    Crawler pushes tuple onto stack (unparsedHTML); 
    UNLOCK; 
end loop; 

1) HTTP: // www.c-sharpcorner.com/UploadFile/mgold/MultithreadingIntro10062005000439AM/MultithreadingIntro.aspx

2) https: // msdn.microsoft.com/en- us/library/aa645740 (v = vs.71) .aspx

3) https: // msdn.microsoft.com/en-us/library/hf5 de04k% 28v = vs.110% 29.aspx

+0

только что заметил, что я не удалял свои комментарии, вы canignore те -_- –

ответ

0

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

Очевидно, что затраты на освобождение и получение блокировок связаны с затратами времени и ресурсов, поэтому для обеспечения правильного баланса между затратами на частое освобождение и захват блокировок, в зависимости от стоимости ожидания блокировок, необходимо найти правильный баланс. В вашем примере это будет означать, что программа работает быстрее, если вы держите только одну блокировку вокруг всего блока кода или запускаете ее быстрее, если придерживаетесь своей нынешней схемы выпуска и получения новой блокировки при переходе на новый общий ресурс? По моему опыту, последнее лучше.

Есть всевозможные оговорки и исключения из того, что я сказал, и вы можете найти некоторые свои собственные, когда вы действительно реализуете код, но ваше текущее мышление о том, как делать блокировки, - это способ, которым я буду действовать ,

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