回答編集履歴

1

追記

2019/04/21 11:10

投稿

YAmaGNZ
YAmaGNZ

スコア10268

test CHANGED
@@ -1 +1,229 @@
1
1
  [ReaderWriterLockSlimクラス](https://docs.microsoft.com/ja-jp/dotnet/api/system.threading.readerwriterlockslim?redirectedfrom=MSDN&view=netframework-4.8)はどうでしょう?
2
+
3
+
4
+
5
+ 単純なサンプルです
6
+
7
+ ```C#
8
+
9
+ using System;
10
+
11
+ using System.Threading.Tasks;
12
+
13
+ using System.Threading;
14
+
15
+
16
+
17
+
18
+
19
+ namespace ConsoleApp1
20
+
21
+ {
22
+
23
+ class Program
24
+
25
+ {
26
+
27
+ static void Main(string[] args)
28
+
29
+ {
30
+
31
+
32
+
33
+ readthread1();
34
+
35
+ readthread2();
36
+
37
+ writethread();
38
+
39
+
40
+
41
+ Console.ReadKey();
42
+
43
+ }
44
+
45
+
46
+
47
+ static ReaderWriterLockSlim lockslim = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);
48
+
49
+
50
+
51
+ static void readthread1()
52
+
53
+ {
54
+
55
+ Task.Run(() =>
56
+
57
+ {
58
+
59
+ while (true)
60
+
61
+ {
62
+
63
+ lockslim.EnterReadLock();
64
+
65
+ Console.WriteLine("Read Thread1 実行開始");
66
+
67
+
68
+
69
+ Thread.Sleep(100);
70
+
71
+
72
+
73
+ Console.WriteLine("Read Thread1 実行終了");
74
+
75
+ lockslim.ExitReadLock();
76
+
77
+
78
+
79
+ Thread.Sleep(200);
80
+
81
+ }
82
+
83
+ });
84
+
85
+ }
86
+
87
+
88
+
89
+
90
+
91
+ static void readthread2()
92
+
93
+ {
94
+
95
+ Task.Run(() =>
96
+
97
+ {
98
+
99
+ while (true)
100
+
101
+ {
102
+
103
+ lockslim.EnterReadLock();
104
+
105
+ Console.WriteLine("Read Thread2 実行開始");
106
+
107
+
108
+
109
+ Thread.Sleep(200);
110
+
111
+
112
+
113
+ Console.WriteLine("Read Thread2 実行終了");
114
+
115
+ lockslim.ExitReadLock();
116
+
117
+
118
+
119
+ Thread.Sleep(300);
120
+
121
+ }
122
+
123
+ });
124
+
125
+ }
126
+
127
+
128
+
129
+
130
+
131
+ static void writethread()
132
+
133
+ {
134
+
135
+ Task.Run(() =>
136
+
137
+ {
138
+
139
+ while (true)
140
+
141
+ {
142
+
143
+ lockslim.EnterWriteLock();
144
+
145
+ Console.WriteLine("Write Thread 実行開始");
146
+
147
+
148
+
149
+ Thread.Sleep(2000);
150
+
151
+
152
+
153
+ Console.WriteLine("Write Thread 実行終了");
154
+
155
+ lockslim.ExitWriteLock();
156
+
157
+
158
+
159
+ Thread.Sleep(300);
160
+
161
+ }
162
+
163
+ });
164
+
165
+ }
166
+
167
+ }
168
+
169
+ }
170
+
171
+
172
+
173
+ ```
174
+
175
+ このような感じに出力されます。
176
+
177
+ ```
178
+
179
+ Read Thread1 実行開始
180
+
181
+ Read Thread2 実行開始
182
+
183
+ Read Thread1 実行終了
184
+
185
+ Read Thread2 実行終了
186
+
187
+ Write Thread 実行開始
188
+
189
+ Write Thread 実行終了
190
+
191
+ Read Thread2 実行開始
192
+
193
+ Read Thread1 実行開始
194
+
195
+ Read Thread1 実行終了
196
+
197
+ Read Thread2 実行終了
198
+
199
+ Read Thread1 実行開始
200
+
201
+ Read Thread1 実行終了
202
+
203
+ Write Thread 実行開始
204
+
205
+ Write Thread 実行終了
206
+
207
+ Read Thread2 実行開始
208
+
209
+ Read Thread1 実行開始
210
+
211
+ Read Thread1 実行終了
212
+
213
+ Read Thread2 実行終了
214
+
215
+ Read Thread1 実行開始
216
+
217
+ Read Thread1 実行終了
218
+
219
+ Write Thread 実行開始
220
+
221
+ Write Thread 実行終了
222
+
223
+ Read Thread2 実行開始
224
+
225
+ Read Thread1 実行開始
226
+
227
+ Read Thread1 実行終了
228
+
229
+ ```