2013-03-27 69 views
1

我有一个2维数组和8个并发线程写入数组。如果每个线程读取/写入不同的阵列,是否会导致seg故障?c线程和资源锁定

例如:

char **buffer; 
//each thread has its own thread ID 
void set(short ID, short elem, char var) 
{ 
    buffer[ID][elem] = var; 
} 

请问这行吗?我知道这是伪代码,但你明白了。

回答

3

如果每个线程都写入到不同的子数组中,那么代码的这个方面将会很好,你不需要锁定。

0

多线程读取或写入内存本身不会导致seg故障。它可以做的是产生一个race condition,其结果取决于多个线程的操作顺序的不确定性。结果取决于您对读取的内存所做的操作......如果您读取一个值然后将其用作索引或解引用指针,则可能导致出界限访问,即使代码的逻辑运行只有一个线程不能。

在您的具体情况中,如果每个线程都使用不同的ID写入非重叠内存,那么在访问数组时不存在竞争条件的可能性。但是,当分配ID时,可能会出现竞争情况,从而导致两个线程接收到相同的ID ...因此您需要使用锁定或其他方式来保证不会发生。

0

您需要注意的主要问题是如何或何时分配2D数组。如果在工作线程开始访问数组之前发生所有分配,并且每个工作线程在线程的整个生命周期内只读写主数组中的一个“行”,并且它是唯一的线程访问该行,那么你不应该有访问或更新数组中的条目的任何线程问题。

如果只有一个线程正在写入一行,但多个线程可能正在读取同一行,那么您可能需要制定一些同步计划,否则由于部分写入,您的读者偶尔会看到不一致/不一致的数据由同时作者撰写。

如果每个工作线程硬连接到主数组中的单个“行”,也可以通过工作线程本身分配和重新分配每行所需的内存,包括更新主数组中的插槽指向线程分配的行数据(重新)。主阵列中的指针槽应该没有争用,因为只有这个工作线程对该槽有兴趣。确保在任何工作线程开始之前分配主数组。对于这种情况,还要确保你的C RTL malloc实现是线程安全的。 (您可能必须在构建选项中选择线程安全的RTL)