- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图停止一些线程,阅读一些有关优雅地执行此操作的正确方法的内容,但我一定是做错了什么,因为它根本不起作用。起初我尝试不使用 lock()
而 _IsRunning
是易变的,然后尝试使用锁。这是我得到的。
private volatile bool _IsRunning;
private static readonly object runLock = new object();
public void Start()
{
if (_IsRunning == true)
return;
_IsRunning = true;
(new System.Threading.Thread(new System.Threading.ThreadStart(SendLoop))).Start();
}
public void Stop()
{
lock (runLock)
{
_IsRunning = false;
}
}
private void SendLoop()
{
while (_IsRunning)
{
lock (runLock)
{
if (_sockets.Count > 0)
{
//some stuff
}
else
{
System.Threading.Thread.Sleep(10);
}
}
}
}
我在 while()
处设置了一个断点,即使我传入了 Stop()
,_IsRunnig
仍然为真。
最佳答案
这里需要锁,因为你的 start 方法是这样写的,但是,你只需要锁在 Start()
(现在不是)和 Stop( )
,因为在您的情况下,它们是唯一可能导致竞争条件的。
我会完全从您的 SendLoop()
方法中删除锁(这会导致 DeadLock 因为 Stop
正在等待锁来设置 _isRunning
,并且您的 SendLoop
一直持有锁,直到 _isRunning
设置为 false)。现在,当您调用 Stop()
时,锁会阻止它设置 _isRunning = false;
但是,您将需要锁定您的 Start()
和 Stop()
方法(除非您完全修改它们的结构方式)。像这样的东西:
public void Start()
{
lock (runLock)
{
if (_IsRunning == true)
return;
_IsRunning = true;
(new System.Threading.Thread(new System.Threading.ThreadStart(SendLoop))).Start();
}
}
public void Stop()
{
lock (runLock)
{
_IsRunning = false;
}
}
这将保护您不启动 2 个线程,并且还将防止 Stop 在线程启动之前停止。
关于c# - 如何在给定点停止线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/694804/
当我在定点 Z3Py 中启用解释生成选项时,我收到包含以下消息的核心转储。 Error setting 'DL_GENERATE_EXPLANATIONS', reason: unknown opti
我正在开发一些代码,可以从 HW 获取浮点或定点数据。目前我们将其作为 float 。 底层API都是定点的。所以我们必须将数据作为定点传回。我们使用的算法是 Cholesky。我想知道为什么我们必须
我有一个关于在 MATLAB 中为 Texas Instruments TMS320C64xx DSP 编写算法的问题: 我在 MATLAB 中草率地实现了我的过滤器。我的目标是使用 MATLAB E
我需要将 float 转换为Q31定点,Q31表示1个符号位,0位表示整数部分,31位表示小数部分。这意味着 Q31 只能表示 [-1,0.9999] 范围内的数字。 根据定义,从浮点转换为定点时,会
我正在使用第 3 方定点 antilog() 函数来计算分贝 out_mag = 10^( in_db/20 ) 的幅度。 antilog() 采用 Q6.25 格式作为输入,并在输出时提供 Q16.
我想将一个定点数(Q31/int32 表示具有 31 个小数位的小数)除以另一个 Q31/int32。我想计算z = y/x,知道abs(x)>abs(y)。因此,z<1,因此可以表示为另一个Q31/
我是一名优秀的程序员,十分优秀!