210 / 208 / 137
Регистрация: 21.12.2015
Сообщений: 545
1

Thread.Sleep и lock

02.01.2017, 23:11. Показов 1626. Ответов 5
Метки нет (Все метки)

Что будет если вызвать Thread.Sleep() внутри блока кода lock?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.01.2017, 23:11
Ответы с готовыми решениями:

Как использовать Thread.Sleep(5000), ошибка: "Элемент "Thread" не существует в текущем контексте"
я так понимаю, что Thread.Sleep(5000); это "тормоз" процесса выполенения программы на 5 сек? А...

Thread.Sleep
Итак, есть примерно вот такой консольный код: static void Main(string args) { ...

Thread.Sleep не работает
Всем привет! Задача такая есть таймер который запускается каждый 30 сек и делает рассылку и...

Странное поведение Thread.Sleep
Забавно, уже не первый раз встречаю такую вещь: делаю движение контрола по форме в цикле...

5
Эксперт .NET
15460 / 11720 / 3079
Регистрация: 17.09.2011
Сообщений: 19,609
02.01.2017, 23:20 2
Цитата Сообщение от TuM0xA Посмотреть сообщение
Что будет если вызвать Thread.Sleep() внутри блока кода lock?
Получите по морде от code reviewer'a.

А тем временем все остальные потоки, синхронизирующиеся на том же объекте, будут дожидаться, пока залоченный поток отоспится.
1
210 / 208 / 137
Регистрация: 21.12.2015
Сообщений: 545
02.01.2017, 23:38  [ТС] 3
kolorotur, то есть thread.sleep внутри lock будет только тормозить программу?
вот код, если тут убрать Thread.Sleep(2); из метода Sum, то результат выполнения изменится, а по идее это случаться не должно
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;
using System.Threading;
class Locker { }
static class SyncLock 
{
    static int[] nums = {1,2,3,4,5,6,7,8,9};
    static Locker lockThis = new Locker();
    public static void Sum() 
    {
 
        for (int i = 0, j = 0; i < 9; i++)
        {
            lock (lockThis)
            {
                Console.Write("{0} ", j += nums[i]);
                nums[i] = 1;
                Thread.Sleep(2);
            }
        }
            
        }
    }
class demo
{
    static void Main()
    {
        Thread thrd1 = new Thread(SyncLock.Sum);
        Thread thrd2 = new Thread(SyncLock.Sum);
        thrd1.Start();  
        thrd2.Start();
        thrd1.Join();
        thrd2.Join();
    }
}
0
Эксперт .NET
15460 / 11720 / 3079
Регистрация: 17.09.2011
Сообщений: 19,609
02.01.2017, 23:49 4
Лучший ответ Сообщение было отмечено TuM0xA как решение

Решение

Цитата Сообщение от TuM0xA Посмотреть сообщение
то есть thread.sleep внутри lock будет только тормозить программу?
Ага.

Цитата Сообщение от TuM0xA Посмотреть сообщение
если тут убрать Thread.Sleep(2); из метода Sum, то результат выполнения изменится, а по идее это случаться не должно
Почему не должно?
Наличие lock само по себе не гарантирует какую-то определенную очередность выполнения, он всего лишь не позволяет двум потокам одновременно находиться в критической зоне.
1
210 / 208 / 137
Регистрация: 21.12.2015
Сообщений: 545
03.01.2017, 00:08  [ТС] 5
kolorotur, можете, пожалуйста, глянуть на код(в предыдущем сообщении) и сказать почему наличие наличие thread.sleep внутри lock влияет на результат выполнения
0
Эксперт .NET
15460 / 11720 / 3079
Регистрация: 17.09.2011
Сообщений: 19,609
03.01.2017, 00:24 6
Лучший ответ Сообщение было отмечено TuM0xA как решение

Решение

Цитата Сообщение от TuM0xA Посмотреть сообщение
почему наличие наличие thread.sleep внутри lock влияет на результат выполнения
Потому что наличие инструкции, блокирующей поток, может повлиять на то, какой поток из очереди ОС решит запустить в критическую зону следующим.
И, как видим, таки влияет.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.01.2017, 00:24

Thread.Sleep под капотом
Доброго времени суток! Собственно, весь вопрос в описании темы. Погуглил - мало информации и...

ProgressBar связать с thread.sleep
как получать progressbar.Value в случае когда стоит задержка в 10 секунд и надо в прогресс бар...

Аналог Thread.Sleep в Task
Имеется пример который запускает пару потоков с задержкой. using System; using...

Более точная альтернатива Thread.Sleep(1)
Как подсказывает мне гугл, Thread.Sleep - это зло во плоти, атата, руки оторвут, и т.д. Раньше...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.