gpt4 book ai didi

C++ 异步段错误

转载 作者:行者123 更新时间:2023-11-28 05:44:49 27 4
gpt4 key购买 nike

于是我写了下面这段代码。它有时会得到:

segment fault::11

但有时不会。你能解释一下为什么吗?

我也很好奇下面的问题。一般情况下,c++如何分配线程/c++什么时候执行launch::asynclaunch::defferred功能? std::wait有什么缺点吗?在 std::get如果它是 future<void>

std::future<void>r1, r2, r3, r4, ret;
//sometimes seg fault, sometimes pass
void f(int id, int t) {
printf("call f(%d)\n", id);
int ans=0;
if (id == 3) {
printf("wait 3\n");
if (r1.valid()) r1.wait();
}
if (id == 4) {
printf("wait 4\n");
if (r1.valid()) r1.wait();
}
printf("start f(%d)\n",id);
cnt[id]++;
for (int i=1;i<=t;i++) {
ans++;
}
printf("end f(%d)\n", id);
}

int main() {
r3=async(f, 3, 1e8);
r4=async(f, 4, 1);

r1=async(f, 1, 1e8);
r2=async(f, 2, 1e2);


ret=async([&]() { r1.wait();r2.wait();r3.wait();r4.wait(); printf("cnt=%d,%d,%d,%d\n", cnt[1],cnt[2],cnt[3],cnt[4]); });

return 0;
}

最佳答案

It sometimes gets:

segment fault::11

But sometimes doesn't. Could you explain why?

我假设 cnt 已正确声明,因此没有越界访问。如果是这样,那么我认为这里的问题是 std::future 对象不是线程安全的,因此对 r1.valid() 的调用>r1.wait() 与发生在 main 中的 r1 的赋值竞争。这样的数据竞争会导致未定义的行为。

看起来你应该移动线

r1=async(f, 1, 1e8);

main 的开头。对 r1 的写入将在为 r3r4 调用 std::async 之前排序。 std::async 的调用与 f 的相应调用同步。所以写入 r1 发生在调用 f 中的 r1.wait 之前。 future::wait 成员函数是const,因此两个线程可以同时调用它而不会出现竞争。

对于更复杂的情况,您可以使用 std::packaged_task(如果您愿意,它可以让您先获取 std::future 并稍后启动)或 std::promise

In general, how does c++ assigns threads to / when does c++ executes launch::async and launch::defferred functions?

如果您要问 std::async 在您给它选择时如何选择要使用的策略,答案是它未指定。

关于C++ 异步段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36434178/

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