在我的应用程序上,我收到UDP包,我需要分析它们。 当package1进入我的机器时 - 我必须锁定一些范围并在分析package2之前进行分析。
网络总是得到包,有一种可能的情况我在分析package1 ...网络层得到了package2和package3,他们正在等待分析。
我可以将任何包添加到concurrentQueue - 但我担心添加到此队列是使用锁定,而队列被锁定,并且两个package2和package3被接收并且正在等待...并且锁定是释放..然后有可能的情况是package3将在package2之前添加...然后package3将在package2之前进行分析,这是一个bug。
有人有其他解决方案吗?答案 0 :(得分:1)
ConcurrentQueue
是标准队列数据结构的无锁线程安全实现。这意味着从队列中添加/删除不会锁定它。
如果您致电Enqueue
,它会将项目添加到队列以确保。 (此方法没有返回值,也没有任何抛出异常)。
这意味着ConcurrentQueue
项中的项将与调用Enqueue
方法的顺序相同。
示例,如何实施Enqueue:
public void Enqueue(T item) {
int insertIndex = Interlocked.Increment(ref m_high);
m_array[insertIndex] = item;
}
注意:如果同时使用不同的线程获得package1
和package2
,则意味着在任何情况下程序的体系结构都会被破坏。如果package1
和package2
是逻辑嵌套的,client
如何同时发送它们。如果客户端以某种方式同时发送它们,则无法处理它。