C#共享变量在线程之间不同
在我当前的应用程序中,我发送一条UDP消息,如果服务器未确认该数据包,则在一秒钟后重新发送。现在,我使用volatile bool作为终止的标志,在主线程中,当接收到ACK时,该标志被设置为true,由断点确认,但在此之后,在另一个线程中的“if(done)break”期间,该标志仍然为falseC#共享变量在线程之间不同,c#,multithreading,C#,Multithreading,在我当前的应用程序中,我发送一条UDP消息,如果服务器未确认该数据包,则在一秒钟后重新发送。现在,我使用volatile bool作为终止的标志,在主线程中,当接收到ACK时,该标志被设置为true,由断点确认,但在此之后,在另一个线程中的“if(done)break”期间,该标志仍然为false ThreadStart processTaskThread = delegate { send(text); }; new Thread(
ThreadStart processTaskThread = delegate {
send(text);
};
new Thread(processTaskThread).Start();
void send(string text)
{
while (true)
{
byte[] data = Encoding.ASCII.GetBytes(text);
_socket.BeginSend(data, 0, data.Length, SocketFlags.None, (ar) =>
{
State so = (State)ar.AsyncState;
int bytes = _socket.EndSend(ar);
Console.WriteLine("SEND: {0}, {1}", bytes, text);
}, state);
Thread.Sleep(1000);
if (kill) break;
}
}
现在,根据断点确认,标志被正确设置为true:
private void Receive()
{
_socket.BeginReceiveFrom(state.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv = (ar) =>
{
State so = (State)ar.AsyncState;
int bytes = _socket.EndReceiveFrom(ar, ref epFrom);
_socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv, so);
try {
string Rec = Encoding.ASCII.GetString(so.buffer, 0, bytes);
if (Rec.StartsWith("ACK:"))
{
kill = true;
return;
}
但是回到线程循环中的条件中,它仍然是false。感谢您的帮助。我想您的
kill
变量不是静态的,volatile
并不意味着线程安全
每个线程都有自己的堆栈。如果希望与多个线程共享kill
变量,则需要将其设置为静态。当前,当您将其状态从true更改为false时,它将在第一个线程堆栈上更改,而不会反映到第二个线程
您需要将其设置为静态,并确保分配是线程安全的。这可以通过使用联锁
类来实现
顺便说一句,正如您所看到的,在布尔值上使用联锁存在问题。解决方法是创建一个整数,将其递增,并检查其是否大于零。请提供一个示例说明问题;我们只需输入一个文件并编译/运行。“我发送一条UDP消息,如果服务器没有确认数据包,我会在一秒钟后重新发送”-听起来你应该使用TCP,而不是UDP。非常感谢你,人类中的上帝。