使用带有多个读取器线程+编写器的Array

时间:2010-08-11 13:02:25

标签: c# arrays thread-safety

我不确定这个..

使用int []数组。 如果在我的应用程序中,线程A在线程B写入同一个数组元素时读取,那么一切都会保持吗?

我宁愿在读取时也没有同步块 - 这是在Web服务中使用的,所以我将无法并行为多个客户端提供服务。

感谢。

奥利弗

5 个答案:

答案 0 :(得分:1)

不,您需要使用锁定块来确保在其他进程正在写入数据时没有人尝试读取数组。否则,您可能会遇到问题。

这在C#中实际上很简单,你可以这样做:

// declare an object to use for locking
Object lockObj = new Object();

// declare the array
int[] x = new int[5];

// set the array value (thread safe operation)
public void SetArrayVal(int ndx, int val)
{
    if (ndx < 0 || ndx >= x.Length)
    {
        throw new ArgumentException("ndx was out of range", ndx);
    }    
    lock (lockObj )
    {
        x[ndx] = val;
    }
}

// get the array value (thread safe operation)
public int GetVal(int ndx)
{
    if (ndx < 0 || ndx >= x.Length)
    {
        throw new ArgumentException("ndx was out of range", ndx);
    }    
    lock (lockObj )
    {
        return x[ndx];
    }
}

我不担心这里的性能,以确保你的线程正确,这是至关重要的。

答案 1 :(得分:1)

如果您阅读的内容多于写作,那么请使用ReaderWriterLockSlim来提高性能(尽管它可能会使您的代码更加冗长。)

如果您担心阻止客户端线程,那么您可以将这些操作排入队列安全队列。老实说,除非你为每个请求采取多个锁定,否则你不必在进入这些锁定时等待足够长的时间让网站的人类用户注意到。在处理高吞吐量和低延迟时,这种性能影响更为显着。

答案 2 :(得分:0)

需要同步多个线程访问的共享资源。

由于数组不是线程安全的,因此您需要自己管理它。

答案 3 :(得分:0)

在线程环境中读取和写入时,数组不是线程安全的: http://msdn.microsoft.com/en-us/library/system.array.aspx

你必须锁定数组,一个t1.Join(); t2.Join()可能会运作,虽然我不确定。

答案 4 :(得分:0)

您需要从多个并发线程锁定对阵列的访问。最简单的方法是只允许使用getter / setter访问您的数组,然后将一些锁定代码放入其中。