c - 为什么下面的函数调用不是线程安全的?

标签 c multithreading

我正在使用 Sun RPC 来实现一个简单的伪分布式存储系统。我在同一台服务器上有三个实例,在同一台机器上有一个客户端。

服务器 RPC 实现是这样的:

char **
fileread64k_1_svc(char *filename, long offset,  struct svc_req *rqstp)
{

    static char * readResult;
    //chunkName is a function of (fileName, offset)

    FILE *chunkFile = fopen(chunkName, "r");
    readResult = (char *) malloc(sizeof(char) * (CHUNKSIZE + 2));
    fread(readResult, 1, CHUNKSIZE, chunkFile);
    readResult[CHUNKSIZE] = '\0';
    fclose(chunkFile);

    return &readResult;
}

我给我的客户端提供了一个要读取的文件列表,客户端创建了 3 个线程(一个用于服务器的每个实例),线程在它们之间分发文件,并像这样调用读取 RPC:

while all files are not read:
    //pthread_mutex_lock(&lock);
    char **out = fileread64k_1(fileName, offset, servers[id]);
    //char *outData = *out;
    //pthread_mutex_unlock(&lock);

但是 out 中的数据在我有机会处理它之前被另一个线程替换了。如果我启用注释行(互斥锁和 outData 变量),我会在 outData 中获取数据并且我似乎能够安全地使用它。

谁能解释为什么会发生这种情况以及是否有更好的解决方法?

最佳答案

因为“readResult”被声明为静态的。这意味着该方法的所有调用都在内存中为该变量使用相同的空间,包括不同线程中的并发调用。

如果您不将 readResult 声明为静态的,则应该注意这个问题——但在那种情况下,您将无法返回它的地址,您应该返回 readResult 本身的值。

顺便说一下,哪个代码负责释放()分配的内存?

关于c - 为什么下面的函数调用不是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22720971/

相关文章:

c - 什么是 *-devel 包?

c - 不透明函数调用在编译器优化中意味着什么?

Java/PriorityQueue 和线程

c++ - 从哪里获得简单的 Boost 线程管理示例?

c# - 在 new Thread() 中创建控件时在正确的线程上调用方法

c++ - Const 正确性和 shared_ptr 转换

c - 同时对两个数组进行并行数组快速排序

c - 为什么这个程序不写入result.txt?

c - 如何避免使用gcc在c中包装输入数据?

c++ - 在宏中连接字符串 - C++