通过System.Threading命名空间的Interlocked类控制计数器,从而实现进程 的同步。Iterlocked类的部分方法如下表:

示例,同时开启两个线程,一个写入数据,一个读出数据
代码如下:(但是运行结果却不是我们想象的那样)
using System;
using System.Threading;
namespace 线程同步
{
class Program
{
static void Main(string[] args)
{
//缓冲区,只能容纳一个字符
char buffer = ',';
string str = ""这里面的字会一个一个读取出来,一个都不会少,,,"";
//线程:写入数据
Thread writer = new Thread(() =>
{
for (int i = 0; i < str.Length; i++)
{
buffer = str[i];
Thread.Sleep(20);
}
}
);
//线程:读出数据
Thread Reader = new Thread(() =>
{
for (int i = 0; i < str.Length; i++)
{
char chartemp = buffer;
Console.Write(chartemp);
Thread.Sleep(30);
}
}
);
writer.Start();
Reader.Start();
Console.ReadKey();
}
}
}
运行结果图:(每次运行结果都不一样)

修改代码如下:
using System;
using System.Threading;
namespace 线程同步
{
class Program
{
//缓冲区,只能容纳一个字符
private static char buffer;
//标识量(缓冲区中已使用的空间,初始值为0)
private static long numberOfUsedSpace = 0;
static void Main(string[] args)
{
//线程:写入者
Thread Writer = new Thread(delegate ()
{
string str = "这里面的字会一个一个读取出来,一个都不会少,,,";
for (int i = 0; i < 24; i++)
{
//写入数据前检查缓冲区是否已满
//如果已满,就进行等待,直到缓冲区中的数据被进程Reader读取为止
while (Interlocked.Read(ref numberOfUsedSpace) == 1)
{
Thread.Sleep(50);
}
buffer = str[i]; //向缓冲区写入数据
//写入数据后把缓冲区标记为满(由0变为1)
Interlocked.Increment(ref numberOfUsedSpace);
}
});
//线程:读出者
Thread Reader = new Thread(delegate ()
{
for (int i = 0; i < 24; i++)
{
//读取数据前检查缓冲区是否为空
//如果为空,就进行等待,直到进程Writer向缓冲区中写入数据为止
while (Interlocked.Read(ref numberOfUsedSpace) == 0)
{
Thread.Sleep(50);
}
char ch = buffer; //从缓冲区读取数据
Console.Write(ch);
Interlocked.Decrement(ref numberOfUsedSpace);
}
});
//启动线程
Writer.Start();
Reader.Start();
Console.ReadKey();
}
}
}
正确结果图:

总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)