C线程和资源锁定



我有一个二维数组和8个并发线程写入数组。如果每个线程读/写不同的数组,会导致段错误吗?

例如:

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

这样可以吗?我知道这是伪代码,但你知道的。

如果每个线程都写不同的子数组,这方面的代码将很好,您将不需要锁定。

多个线程对内存的读写本身并不会导致segfault。它所能做的是导致竞争条件,其中结果不确定地依赖于多个线程的操作顺序。结果取决于你如何处理你读到的记忆。如果读取一个值,然后将其用作索引或对指针解引用,则可能导致越界访问,即使仅由一个线程运行的代码逻辑不会。

在您的特定情况下,如果每个线程都因为使用不同的ID而写入非重叠内存,那么在访问数组时就不可能出现竞争条件。然而,当分配ID时,可能会出现竞争条件,导致两个线程接收到相同的ID…所以你需要使用锁或其他方式来保证不会发生这种情况

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

如果只有一个线程写入一行,但是多个线程可能从同一行读取,那么您可能需要制定一些同步计划,否则您的读取器可能会偶尔看到由于并发写入器的部分写入而导致的不一致/不一致数据。

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

最新更新