So schrieb ich das folgende Stück Code. Es wird manchmal:C++ async Segmentfehler
Segment Fehler :: 11
Aber manchmal nicht. Können Sie erklären warum?
Ich bin auch neugierig auf die folgenden Fragen. Im Allgemeinen, wie C++ - Threads zu/wann C++ führt launch::async
und launch::defferred
Funktionen? Gibt es einen Nachteil von std::wait
über std::get
, wenn es ein future<void>
ist?
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;
}
Deklaration von 'cnt'? 1-basierte Array-Indizierung ist ein wichtiger Punkt. –
Was ist cnt? Anzahl? Warum nennst du es nicht zählen? Das ist nirgends definiert. Es würde helfen, wenn es sinnvolle Variablennamen gäbe. Und Sie beziehen sich auf r1 wenn 'id == 4 oder 3'. Bei einem asynchronen Aufruf gibt es keine Garantie, dass r1 initialisiert wird, daher kann ein Aufruf von r1.valid() einen Seg-Fehler verursachen. –
@ChristopherSchneider Sie können 'valid() 'in einer standardkonstruierten Zukunft aufrufen. Es gibt nur "falsch" zurück. – Brian