gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:43:13 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com