通过多线程,C#可以并行地执行代码。
每一个线程都有它独立的执行路径,所有线程都能访问共有变量。
这就引发了线程竞争
这时就需要使用线程安全的处理方式使得线程互斥
先来看一段多线程代码
using System;
using System.Timers;
using System.Threading;
public class MultiThread{
static string str = " ";
public static void Main(string[] args) {
Thread t1 = new Thread(Add1);
t1.Start();
Thread t2 = new Thread(Add2);
t2.Start();
Thread.Sleep(1000);
Console.WriteLine(str);
}
public static void Add1() {
for (int i = 0; i < 10; i++) {
Thread.Sleep(10);
str += "1";
}
}
public static void Add2()
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(10);
str += "2";
}
}
}
线程Add1和线程Add2并行执行
因而变量str被两个线程同时操作
为了避免此线程竞争
可以通过加锁(lock)的方法解决
当两个线程争夺一个锁的时候,一个线程获得锁资源,另一个线程则等待
在不确定的多线程环境中代码以此方式处理被叫做线程安全
加锁后代码:
public static void Add1()
{
lock (str)
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(10);
str += "1";
}
}
}
public static void Add2()
{
lock (str)
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(10);
str += "2";
}
}
}
明天总结Unity服务端连接MySql数据库,嗯~