gpt4 book ai didi

c# - 线程同步

转载 作者:行者123 更新时间:2023-11-30 15:06:44 25 4
gpt4 key购买 nike

数据必须在线程之间共享。哪种同步方法最好?

锁是更好的方法还是互斥锁?

namespace ConsoleApplication8
{
class Data
{
public int X
{
set;
get;
}

public int Y
{
get;
set;
}

public int result;
}

class Program
{
static int a;
private static object aLock = new object();

static void Main(string[] args)
{
ParameterizedThreadStart aStart = new ParameterizedThreadStart(Addition);
Thread aThread = new Thread(aStart);
Data aData = new Data();
aData.X = 10;
aData.Y = 20;

Thread aThread2 = new Thread(aStart);
aThread2.Start();


aThread.Start(aData);
aThread.Join();
aThread2.Join();
Console.WriteLine("End of the program");
}

static void Addition(object data)
{
var a = data as Data;
var b = a.X + a.Y;
a.result = b;

Console.WriteLine(a.result);
Thread.Sleep(1000);
Console.WriteLine("End of thread");
updateValue();
}

static void updateValue()
{
lock (aLock)
{
a++;
}
}
}
}

最佳答案

您有两个地方可以“同步”线程。

您正在使用 Thread.Join 等待您的线程完成,然后再继续您的主线程。没关系。

您还使用锁来确保一次只有一个线程递增您的计数器变量 a。这也很好,但可以改进。 System.Threading 中有一个名为Interlocked 的类,可以线程安全的方式为您执行增量。

Interlocked.Increment(ref a);

您的代码确实在两个地方使用了变量 a - 在 Addition 中您有一个局部变量 a 隐藏了静态外部变量 一个。我认为这只是巧合。

另一个问题是您的 Addition 方法将 object 作为参数。我理解为什么它不将 Data 作为参数,因为 ParameterizedThreadStart 需要一个对象。有更好的解决方法。

试试这个代码:

private static int __counter = 0;

public class Data
{
public int X { set; get; }
public int Y { set; get; }
public int Result { set; get; }
}

private void Addition(Data data)
{
data.Result = data.X + data.Y;
Interlocked.Increment(ref __counter);

Thread.Sleep(1000);

Console.WriteLine(data.Result);
Console.WriteLine("End of thread");
}

现在Main可以写成:

void Main()
{
ParameterizedThreadStart pts = o => Addition(o as Data);

var t1 = new Thread(pts);
var t2 = new Thread(pts);

t1.Start(new Data { X = 10, Y = 20 });
t2.Start(new Data { X = 13, Y = 42 });

t1.Join();
t2.Join();

Console.WriteLine(__counter);
Console.WriteLine("End of the program");
}

那应该更整洁一些。

我看不出您在代码中共享了哪些数据。也许您可以详细说明一下?

关于c# - 线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7343375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com