0 / 0 / 0
Регистрация: 14.12.2014
Сообщений: 14
1

Почему в приведенном коде выводится число 6?

22.10.2015, 21:43. Показов 1095. Ответов 4
Метки нет (Все метки)

Собственно вопрос в теме, почему выводится число 6?
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static int state = 3;
        
        static object ob = new object();
        static void tr()
        {
            for (int i = 0; i <= 10000000; i++)
            {
                Race(); 
                
            }
 
        }
       
        static void Race()
        {
            
 
                if (state == 3)
                {
                    state++;
                    if (state != 4) { Console.Write(state); }  
                    state = 3;
                }
           
        }
 
        static void Main(string[] args)
        {
            Thread t1 = new Thread(tr);
            Thread t2 = new Thread(tr);
            t1.Start();
            t2.Start();
 
            Console.ReadKey();
        }
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2015, 21:43
Ответы с готовыми решениями:

Почему решение не рационально в приведенном коде
using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

Почему не меняется значение переменной в приведенном коде
Здравствуйте, у меня есть код: Object a = 0; Object b = a; a...

Почему в приведенном коде не увеличивается размерность массива
Помогите найти ошибку. Не понимаю что тут не правильно int x, y; x = 0;...

Почему в приведенном коде сообщается о переменной, которой не присвоено значение
Доброго времени суток! Подскажите, почему возникает ошибка &quot;Использование локальной переменной,...

4
Эксперт .NET
16746 / 12498 / 3285
Регистрация: 17.09.2011
Сообщений: 20,730
22.10.2015, 22:40 2
Лучший ответ Сообщение было отмечено Skynet_inc как решение

Решение

Цитата Сообщение от Skynet_inc Посмотреть сообщение
почему выводится число 6?
Потому что вам "повезло": при гонке может выводиться любое значение, включая 3, 4 и 5.
0
0 / 0 / 0
Регистрация: 14.12.2014
Сообщений: 14
22.10.2015, 22:44  [ТС] 3
Потому что вам "повезло": при гонке может выводиться любое значение, включая 3, 4 и 5.
Я понимаю каким образом выводится 3,4,5, но не 6, я предполагаю что один из потоков прерывается на самом операторе присваивания, в результате чего складывается 2 раза. Не могли бы вы обьяснить вывод 6ки?
0
Эксперт .NET
16746 / 12498 / 3285
Регистрация: 17.09.2011
Сообщений: 20,730
22.10.2015, 23:01 4
Лучший ответ Сообщение было отмечено Skynet_inc как решение

Решение

Цитата Сообщение от Skynet_inc Посмотреть сообщение
я предполагаю что один из потоков прерывается на самом операторе присваивания, в результате чего складывается 2 раза
Вы правильно предполагаете.
Инкремент не является атомарным, если его расписать на действия, которыe фактически происходят, то сразу становится понятно, откуда берется шестерка:
C#
1
2
3
4
5
6
7
8
9
if (state == 3)
{
   int temp = state;
   int result = temp + 1;
   state = result;
 
   if (state != 4) Console.WriteLine(state);
   state = 3;
}
Теперь запускаем 2 потока (А и Б):
1. А прошел проверку
2. Б прошел проверку
3. А записал 3 в темп
4. А записал 4 в результат
5. А записал 4 в state
6. А вывел значение на консоль
7. Б взял значение 4
8. Б записал 5 в результат
9. А записал 3 в state
10. А прошел проверку
11. Б записал 5 в state
12. А взял значение 5 и записал в temp
13. Б вывел 5 в консоль
14. А записал 6 в result
15. А записал 6 в state
16. А вывел 6 в консоль
17. Б записал 3 в state.
1
0 / 0 / 0
Регистрация: 14.12.2014
Сообщений: 14
22.10.2015, 23:23  [ТС] 5
Огромное спасибо за помощь. Теперь все ясно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2015, 23:23
Помогаю со студенческими работами здесь

Почему происходит блокировка потоков в приведенном коде
Здравствуйте. Есть метод run. Создаются и запускаются 2 потока для вызова этого метода. По моему ...

Конструктор без параметров: не выводится строка в приведенном коде
#include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &lt;iostream&gt; using namespace::std; class String...

Создать запрос, который выведет точный возраст (лет, месяцев, дней); в приведенном коде выводится неправильно месяц
SELECT Stud_FAM, Stud_DATE, convert(int, (GETDATE() - Stud_DATE) /365.25 as 'Возраст', 12+ MONTH...

Почему mas(0,0) пустой в приведенном коде
Почему mas(0,0) пустой? Sub CoolSort(ByRef SourceArr() As Variant, ByVal N As Integer) '...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru