2010-08-11 66 views
3

我不确定此问题..使用Array with multiple reader threads + writer

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

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

谢谢。

Olivier

回答

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]; 
    } 
} 

我不会太在乎的性能这里,以确保您获得线程saftiness正确的,这是关键。

+0

感谢您的片段!而你对性能和线程安全性的评论 - 我的确关心性能。 – user338421 2010-08-11 13:48:10

+0

@osteinme - 不客气:)。如果数据损坏,性能无关紧要,所以如果您需要线程安全性,则必须确保数据访问是同步的。我真的怀疑,除非你每秒做数百万次操作,否则性能会受到很大的影响。 – dcp 2010-08-11 14:10:57

0

您需要锁定来自多个并发线程的数组访问权限。最简单的方法是只允许使用getters/setter访问你的数组,然后在这些数组中加入一些锁定代码。

1

如果你正在做的比写多读,然后用ReaderWriterLockSlim以提高性能(虽然它可能使你的代码更详细。)

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

+0

谢谢,非常有用。不幸的是我仍然处于2.0环境,所以会使用ReaderWriterLock,但是当我们升级时我们需要使用slim。 – user338421 2010-08-11 13:43:51