gpt4 book ai didi

c++ - qsort线程安全吗?

转载 作者:太空宇宙 更新时间:2023-11-03 10:21:49 36 4
gpt4 key购买 nike

我有一些旧代码使用 qsort 对结构的 MFC CArray 进行排序,但我看到了 可能 导致的偶尔崩溃多个线程同时调用 qsort。我使用的代码看起来像这样:

struct Foo
{
CString str;
time_t t;

Foo(LPCTSTR lpsz, time_t ti) : str(lpsz), t(ti)
{
}
};

class Sorter()
{
public:
static void DoSort();
static int __cdecl SortProc(const void* elem1, const void* elem2);
};

...

void Sorter::DoSort()
{
CArray<Foo*, Foo*> data;
for (int i = 0; i < 100; i++)
{
Foo* foo = new Foo("some string", 12345678);
data.Add(foo);
}

qsort(data.GetData(), data.GetCount(), sizeof(Foo*), SortProc);
...
}

int __cdecl SortProc(const void* elem1, const void* elem2)
{
Foo* foo1 = (Foo*)elem1;
Foo* foo2 = (Foo*)elem2;
// 0xC0000005: Access violation reading location blah here
return (int)(foo1->t - foo2->t);
}

...

Sorter::DoSort();

我正准备重构这个可怕的代码以使用 std::sort 代替,但想知道上面的代码是否真的不安全?

编辑:Sorter::DoSort 实际上是一个静态函数,但本身不使用静态变量。

EDIT2:SortProc 函数已更改以匹配真实代码。

最佳答案

您的问题不一定与线程安全有关。

排序回调函数接受指向每个项目的指针,而不是项目本身。由于您正在对 Foo* 进行排序,因此您实际上想要做的是将参数作为 Foo** 进行访问,如下所示:

int __cdecl SortProc(const void* elem1, const void* elem2)
{
Foo* foo1 = *(Foo**)elem1;
Foo* foo2 = *(Foo**)elem2;
if(foo1->t < foo2->t) return -1;
else if (foo1->t > foo2->t) return 1;
else return 0;
}

关于c++ - qsort线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2424505/

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