Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中不同类的两个线程之间共享数据#_C#_Multithreading_Variables - Fatal编程技术网

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
关键字)。如果需要在不同对象之间共享某些数据(无论其类型如何),则应将其放在共享容器中或声明为共享。共享容器可以是一个类对象,您可以实例化一次,并在构建期间或之后传递给所有工作对象;否则,您可以将现有字段标记为静态字段,任何代理实例都将访问相同字段的值。