gpt4 book ai didi

c - 以下 C 函数是线程安全的吗?

转载 作者:太空狗 更新时间:2023-10-29 16:06:54 25 4
gpt4 key购买 nike

我看到一篇博客说下面的代码是线程安全的,但是条件 count 不在 mutex 内会导致数据损坏;如果两个线程同时检查 count,但在其中一个获取 mutex 之前,一个在竞争之后获取 mutex。当一个线程完成时,另一个线程会非常盲目地向数组中再添加一个值。

char arr[10];
int count=0;

int func(char ctr)
{
int i=0;
if(count >= sizeof(arr))
{
printf("\n No storage\n");
return -1;
}

/* lock the mutex here*/

arr[count] = ctr;
count++;

/* unlock the mutex here*/

return count;
}

如果我进行以下更改是否正确?或者有更好/更有效的方法吗

   int func(char ctr)
{
int i=0;

/* lock the mutex here*/

if(count >= sizeof(arr))
{
printf("\n No storage\n");

/* unlock the mutex here*/

return -1;
}


arr[count] = ctr;
count++;

/* unlock the mutex here*/

return count;
}`

最佳答案

你是对的。通过在关键部分之外进行检查,您为可能的缓冲区溢出打开了大门。但是,请注意,返回的计数可能与用于存储点击率的索引不同。即使在更正后的代码中,这也是一个问题。

为了补救,你可以这样重写它:

int func(char ctr)
{
/* lock the mutex here*/

if(count >= sizeof(arr)) {
printf("\n No storage\n");

/* unlock the mutex here*/

return -1;
}


arr[count] = ctr;
int c = count++;

/* unlock the mutex here*/

return c;
}

值得注意的是,如果这是唯一改变“计数”的函数,那么没有两个线程能够改变 arr 中的相同内存位置,这实际上是安全的:

int func(char ctr)
{
/* lock the mutex here*/

if(count >= sizeof(arr)) {
printf("\n No storage\n");

/* unlock the mutex here*/

return -1;
}

int c = count++;

/* unlock the mutex here*/

arr[c] = ctr;

return c;
}

如果是这种模式,也许您可​​以将该代码重构为两个函数,如下所示:

int get_sequence(void)
{
/* lock the mutex here*/

int c = count++;

/* unlock the mutex here*/

return c;
}

int func(char ctr)
{
int c = get_sequence();
if(c >= sizeof(arr)) {
printf("\n No storage\n");
return -1;
}

arr[c] = ctr;

return c;
}

请注意,只有当 get_sequence 确实是唯一改变计数变量的函数时,它才会起作用。

关于c - 以下 C 函数是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25518196/

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