C# 多线程系统是否会影响延迟计数的准确性

C# 多线程系统是否会影响延迟计数的准确性,c#,windows,C#,Windows,在Windows中(假设使用四核处理器),当前有4个高优先级线程并行运行 我必须执行一个简单的应用程序,它只对每X/2毫秒计数。其中“X”是用于线程上下文切换的最小时间(以毫秒为单位) 在这种情况下,正在更新的计数将无法准确告知经过了多少X/2毫秒 是这样吗?这里的问题是递增一个变量不是线程安全的,您必须以某种方式锁定它,否则在不同CPU上运行的线程将不断使用最新的计数器值过期 最好的方法是使用某种锁定机制,例如lock。然而,这将有一些开销,不会给你真正的最大性能 如果您想尽可能接近地考虑使用

在Windows中(假设使用四核处理器),当前有4个高优先级线程并行运行

我必须执行一个简单的应用程序,它只对每X/2毫秒计数。其中“X”是用于线程上下文切换的最小时间(以毫秒为单位)

在这种情况下,正在更新的计数将无法准确告知经过了多少X/2毫秒


是这样吗?

这里的问题是递增一个变量不是线程安全的,您必须以某种方式锁定它,否则在不同CPU上运行的线程将不断使用最新的计数器值过期

最好的方法是使用某种锁定机制,例如
lock
。然而,这将有一些开销,不会给你真正的最大性能

如果您想尽可能接近地考虑使用一个更好的锁定机制,<代码>锁定< /代码>,例如:

Interlocked.Increment(ref myNum);

递增指定变量并将结果存储为原子变量 手术

Increment
基本上变成了“总线锁定”语句。此语句锁定总线,以防止另一个CPU在调用CPU执行其操作时访问总线


但是,最好查看所有互锁的方法,以查看各种可用的原子操作,并找到适合您需要的操作。如果您想执行更复杂的操作,如多个相互关联的递增/递减,或序列化对比整数更复杂的资源的访问,请使用
lock()。你在计算什么?这不是一个真正的项目。我只是想澄清一下。计数不算什么,只是每X/2毫秒增加一次。很难猜到你还期望发生什么。您有一个时钟,可以准确跟踪实际经过的时间,DateTime.UtcNow。谢谢您的回答。所以我应该用lock()语句编写一个专用的线程安全代码来实现这一点。
lock
将比
Interlocked.Increment(ref myNum)慢但是,要使其线程安全,或者从您的计数中获得合理的值,您需要使其线程化。但是,我认为,没有办法将CPU内核专用于我计划以编程方式实现的进程。有一个选项可以将线程优先级提高到更高的级别。但仍然会被硬件中断中断。因此,在windows中,要使它像在实时系统中一样是不容易的。很难知道您正在尝试做什么。但简而言之,在多线程环境中保留计数器不是线程safe@Jebakumar如果这有助于确保你的投票和正确的标记,或者如果你找到另一个解决方案,考虑添加你自己的答案并标记正确,这样你可以帮助未来的读者。