程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c#線程基礎之原子操作

c#線程基礎之原子操作

編輯:關於C語言

使用System.Threading.Interlocked類可以提高線程的安全性,具體資料參考msdn: http://msdn.microsoft.com/zh-cn/library/system.threading.interlocked.ASPx 一般情況下,在子線程內使用i++這樣的方式訪問全局變量的方式是不安全的做法。測試下面的代碼,在test1中經過100次number++,number並沒有每次從0變為100,而test2則沒有問題。

01.using System;
02.
03.using System.Windows.Forms;
04.
05.namespace WindowsApplication32
06.
07.{
08.
09. public partial class Form1 : Form
10.
11. {
12.
13. public Form1()
14.
15. {
16.
17. InitializeComponent();
18.
19. }
20.
21. int number = 0;
22.
23.
24.
25. /// <summary>
26.
27. /// 普通的變量訪問方式
28.
29. /// </summary>
30.
31. private void test1()
32.
33. {
34.
35. for (int m = 0; m < 10; m++)
36.
37. {
38.
39. number++;
40.
41. System.Threading.Thread.Sleep(100);
42.
43. }
44.
45. Console.WriteLine(number);
46.
47. }
48.
49. private void button1_Click(object sender, EventArgs e)
50.
51. {
52.
53. number = 0;
54.
55. for (int i = 0; i < 10; i++)
56.
57. {
58.
59. new System.Threading.Thread(test1).Start();
60.
61. }
62.
63. }
64.
65. /// <summary>
66.
67. /// 使用原子的訪問方式
68.
69. /// </summary>
70.
71. private void test2()
72.
73. {
74.
75. for (int m = 0; m < 10; m++)
76.
77. {
78.
79. System.Threading.Interlocked.Increment(ref number);
80.
81. System.Threading.Thread.Sleep(100);
82.
83. }
84.
85. Console.WriteLine(number);
86.
87. }
88.
89. private void button2_Click(object sender, EventArgs e)
90.
91. {
92.
93. number = 0;
94.
95. for (int i = 0; i < 10; i++)
96.
97. {
98.
99. new System.Threading.Thread(test2).Start();
100.
101. }
102.
103. }
104.
105. }
106.
107.}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved