C# 如何在C中不同类的两个线程之间共享数据#
我已经搜索了很多,但我找不到一个适合我的答案。下面是一些相关的代码片段C# 如何在C中不同类的两个线程之间共享数据#,c#,multithreading,variables,C#,Multithreading,Variables,我已经搜索了很多,但我找不到一个适合我的答案。下面是一些相关的代码片段 public partial class Form1 : Form { private String[,] _maze; private String _state; private int _start; private Boolean _finished = false; private void button1_Click(object sender, EventArgs
public partial class Form1 : Form
{
private String[,] _maze;
private String _state;
private int _start;
private Boolean _finished = false;
private void button1_Click(object sender, EventArgs e)
{
var agent = new Agent(_maze, new ArrayList {_start}, _finished);
var agentThread = new Thread(agent.Run);
agentThread.Start();
while (!_finished)
{
Thread.Sleep(100);
}
//some other code
}
}
代理人:
public class Agent
{
volatile String[,] _maze;
ArrayList _path;
volatile Boolean _finished;
public Agent(String[,] maze, ArrayList path, Boolean finished)
{
_maze = maze;
_path = path;
_finished = finished;
}
}
我需要共享以下变量:_maze和_finished,以便所有可能的线程(在本例中是表单和代理)都可以访问相同的数据。我尝试了属性ref
和volatile
,还用[Synchronization]注释了代理类
同样重要的是要知道,代理也会启动具有相同需求的其他代理
在我的情况下,同步数据并不重要(我认为)
更新:
我们应该用这个特定的算法实现一个迷宫解算器:在每一步上,当代理有多个可以去的领域时,他应该克隆自己并从那里走所有可能的路径。
如果一个代理找到了目标,那么每个代理都应该停止,表单类必须进行一些计算,例如高亮显示路径。也许您可以尝试使用静态变量和静态方法来实现这一点。如果想成为线程安全的,可以考虑在静态方法中添加锁。我不确定我是否理解,您将代理成员标记为易失性?你想让代理知道其他代理何时完成?从你的描述中,我想那部分不清楚。如果您只需要知道某个特定代理是否已完成,则可以在代理完成时使用回调运行,而不是不断监视它。如果多个线程访问相同的数据,则需要进行一些同步,以便在线程之间实现数据的一致视图。我建议您查看
AutoResetEvent
和lock
关键字如果您将这三件事封装在一个类中,您可以将对该实例的引用传递给代理,并从任何位置处理这些属性。但我不确定它们都控制同一个“完成”指示器是否有意义,因为一个人可以在其他人仍在运行时完成。需要更多关于此用法的逻辑和示例。需要注意的是,volatile
关键字本身没有任何作用,只是提示编译器该变量的行为。我支持他的建议。(就个人而言,在几乎每个项目中使用多个线程时,我实际上从未使用过volatile
关键字)。如果需要在不同对象之间共享某些数据(无论其类型如何),则应将其放在共享容器中或声明为共享。共享容器可以是一个类对象,您可以实例化一次,并在构建期间或之后传递给所有工作对象;否则,您可以将现有字段标记为静态字段,任何代理实例都将访问相同字段的值。