static void Main(string[] args)
{
Thread PT = new Thread(new ThreadStart(Producer));
Thread CT = new Thread(new ThreadStart(Consumer));
PT.Start();
CT.Start();
Thread.Sleep(1000);//等待2個線程完成
Console.WriteLine(value);
} static int value = 0;
static bool[] flag = { false, false };
static int turn = 0; static void Producer()
{
for (int i = 0; i != 100000; ++i)
{
flag[0] = true;
turn = 1;
while (flag[1] && turn==1)
;
++value;//臨界區
flag[0] = false;
}
} static void Consumer()
{
for (int i = 0; i != 100000; ++i)
{
flag[1] = true;
turn = 0;
while (flag[0] && turn == 0)
;
--value;//臨界區
flag[1] = false;
}
}
}
如果這兩個線程互斥,最后value值應為0.
但運行結果是,value不一定是0.
PS:請不要告訴我"使用lock"之類的辦法.我正在學<<操作系統概念>>中"進程同步"一章,希望自己實現對臨界區加鎖.
解决方案 »
- 在WIN7上做的一个网站求解决
- (急)如何在Winform程序中,绘制矩形框并能拖动和缩放调整
- 编写好一个小程序,安装完成如何实现自己所需要的图标。
- 读取xml某个节点下的所有值! 顶者有分
- c#泛型集合问题?
- 请问如何将一个memStream转换为二进制流
- 急!急!急! 那位高手可以告诉我一下,ASP。NET怎么用自带的工具打包可以是自己在安装的过程中设置虚拟目录?谢谢!
- 50分,轻松解决问题。toolbar添加了一个按纽后怎么添加图片,
- 一个简单问题:怎么让一个页面在没人操作10分钟以后跳转到另外一个页面?
- NPOI 导入文件出错:给定关键字不在字典中
- 请教流程UI的制作
- 如何用正则表达检查英文单词
在两个线程里分别加上这么一句:结果应该是0吧?if (turn == 0)
{
turn = 1;
}
if (turn == 1)
{
turn = 0;
}
//对value的操作改成Interlocked.Increment试试.
static void Main(string[] args)
{
Thread PT = new Thread(new ThreadStart(Producer));
Thread CT = new Thread(new ThreadStart(Consumer));
PT.Start();
CT.Start();
Thread.Sleep(1000);//等待2個線程完成
Console.WriteLine(value);
} static int value = 0;
static bool[] flag = { false, false };
static int turn = 0; static void Producer()
{
for (int i = 0; i != 100000; ++i)
{
flag[0] = true;
turn = 1;
while (flag[1] && turn==1)
;
//++value;//臨界區
System.Threading.Interlocked.Increment(ref value);
flag[0] = false;
}
} static void Consumer()
{
for (int i = 0; i != 100000; ++i)
{
flag[1] = true;
turn = 0;
while (flag[0] && turn == 0)
;
//--value;//臨界區
System.Threading.Interlocked.Decrement(ref value);
flag[1] = false;
}
}
}
而我是要自己實現對臨界區加鎖.
不加鎖,最終結果往往為幾千到幾萬:
static void Main(string[] args)
{
Thread PT = new Thread(new ThreadStart(Producer));
Thread CT = new Thread(new ThreadStart(Consumer));
PT.Start();
CT.Start();
Thread.Sleep(1000);//等待2個線程完成
Console.WriteLine(value);
} static int value = 0; static void Producer()
{
for (int i = 0; i != 100000; ++i)
{
++value;//臨界區
}
} static void Consumer()
{
for (int i = 0; i != 100000; ++i)
{
--value;//臨界區
}
}
像頂樓那樣不成功的加鎖,結果通常為幾十到幾百:
static void Main(string[] args)
{
Thread PT = new Thread(new ThreadStart(Producer));
Thread CT = new Thread(new ThreadStart(Consumer));
PT.Start();
CT.Start();
Thread.Sleep(1000);//等待2個線程完成
Console.WriteLine(value);
} static int value = 0;
static bool[] flag = { false, false };
static int turn = 0; static void Producer()
{
for (int i = 0; i != 100000; ++i)
{
flag[0] = true;
turn = 1;
while (flag[1] && turn==1)
;
++value;//臨界區
flag[0] = false;
}
} static void Consumer()
{
for (int i = 0; i != 100000; ++i)
{
flag[1] = true;
turn = 0;
while (flag[0] && turn == 0)
;
--value;//臨界區
flag[1] = false;
}
}
}
稍微改變一下加鎖的方式,結果大部分時候為0,偶然為1或2:
static void Main(string[] args)
{
Thread PT = new Thread(new ThreadStart(Producer));
Thread CT = new Thread(new ThreadStart(Consumer));
PT.Start();
CT.Start();
Thread.Sleep(1000);//等待2個線程完成
Console.WriteLine(value);
} static int value = 0;
static bool flag0 = false;
static bool flag1 = false;
static int turn = 0; static void Producer()
{
for (int i = 0; i != 100000; ++i)
{
flag0 = true;
turn = 1;
while (flag1 && turn==1)
;
++value;//臨界區
flag0 = false;
}
} static void Consumer()
{
for (int i = 0; i != 100000; ++i)
{
flag1 = true;
turn = 0;
while (flag0 && turn == 0)
;
--value;//臨界區
flag1 = false;
}
}
上面这个是2个变量,几率是要小点
{
Thread PT = new Thread(new ThreadStart(Producer));
Thread CT = new Thread(new ThreadStart(Consumer));
PT.Start();
CT.Start();
Thread.Sleep(1000);//等待2個線程完成
Console.WriteLine(value);
} static int value = 0;
static bool[] flag = { false, false };
static int turn = 0; static void Producer()
{
for (int i = 0; i != 100000; ++i)
{
flag[0] = true;
if (turn == 0)
{
turn = 1;
}
while (flag[1] && turn==1)
;
++value;//臨界區
flag[0] = false;
}
} static void Consumer()
{
for (int i = 0; i != 100000; ++i)
{
flag[1] = true;
if (turn == 1)
{
turn = 0;
}
while (flag[0] && turn == 0)
;
--value;//臨界區
flag[1] = false;
}
}
}试一下!!!
而且对于turn的操作不是原子操作,所以会出现调度失败的问题。
使用循环实现PV有点忘了,如果还有需要,请邮箱[email protected]
flag[0] = true;flag[1] = true;turn = 1;
while (flag[1] && turn==1)
;
++value;//臨界區turn = 0;
while (flag[0] && turn == 0)
;
--value;//臨界區而且你用了 busy loop 方式,这个方法在多线程中是不推荐使用的。