功能:两个线程,一个写入数据,一个读出数据
未互斥同步
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 测试interlock
{
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.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 测试interlock
{
class Program
{
/// <summary>
/// 缓冲区,只能容纳一个字符
/// </summary>
private static char buffer;
/// <summary>
/// 标识量(缓冲区中已使用的空间,初始值为0)
/// </summary>
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]; //向缓冲区写入数据
Interlocked.Increment(ref numberOfUsedSpace); //写入数据后把缓冲区标记为满(由0变为1)
}
});
//线程:读出者
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();
}
}
}
参考:
https://www.jb51.net/article/149543.htm