Forum: PC-Programmierung threadpool mit std::forward(), eigener Code compiliert nicht mehr


von Gerader Ast (Gast)


Lesenswert?

Hallo eine Frage an die C++17 Experten:
Ich nutze die threadpool-Klasse von
https://github.com/fbastos1/thread_pool_cpp17/
die bisher sehr gut tut was sie soll.
Aber dort wurde ein Aufruf geändert, in der execute() - Funktion:
1
-       _fargs = std::make_tuple(std::forward<Args>(args)...)]() mutable {
2
+       _fargs = std::forward_as_tuple(std::forward<Args>(args)...)]()

Wenn ich das update, funktioniert mein Code nicht mehr:
Threadfunktion:
1
static void renderFractalBand(uint ystart, uint yend, CMainWnd* wnd);

Aufruf:
1
wnd->renderBand.push_back(wnd->fractalPool.execute(renderFractalBand, y, yend, wnd));

Das ist fractalPool und renderBand:
1
thread_pool fractalPool;
2
std::vector<std::future<void>> renderBand; // for threaded renderer

Der Compiler meint:

Error C2280: 'thread_pool::execute::<lambda_1>::<lambda_1>(const 
thread_pool::execute::<lambda_1> &)': attempting to reference a deleted 
function und viele weiter Zeilen...

Es scheint so, daß die Argumente des Futures kopiert werden müssen, was 
ja mit einem Pointer gehen sollte.
Da ich mich mit std::future usw. noch nicht so gut auskenne, was könnte 
ich machen damit es wieder geht?

von Oliver S. (oliverso)


Lesenswert?

Auch wenn das jetzt nicht die übliche Hausaufgabe-Noob-Frage ist, sind 
Fragen der Art "ich habe irgendwo irgend eine Software heruntergeladen, 
damit irgendwas gemacht, und es funzt irgendwo irgendwas nicht" selten 
sinnvoll zu beantworten. Die klassische Antwort ist da "Fehler in Zeile 
42".

Ein vollständiger compilierbarer (bzw. in dem Fall nicht-compilierbarer) 
Code als Anhang wäre hilfreich.

Oliver

von Oliver S. (oliverso)


Lesenswert?

Nachtrag: wie die Fehlermeldung vermuten lässt, und die Doku zu der 
Fehlermeldung bestätigt, wird da auf eine „deleted function“ 
zugegriffen, sehr wahrscheinlich ein fehlender oder auch absichtlich 
verhinderter copy- oder move-constructor.
Welche Klasse das auslöst, steht mit Sicherheit weiter unten in der 
Fehlermeldung, aber das musst du selber lesen. Das warum ist dann auch 
deine Sache.

https://docs.microsoft.com/de-de/cpp/error-messages/compiler-errors-1/compiler-error-c2280?view=msvc-160

Oliver

: Bearbeitet durch User
von Gerader Ast (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, danke erstmal für die Antworten. Auch wenn es wohl schwieriger 
als gedacht ist.
Habe gerade das Beispiel von der Ersteller-Seite des Threadpools 
probiert,
es funktioniert auch nicht mehr mit der letzten Änderung des Erstellers 
in "threadpool.h".

Im Anhang findet ihr die Quellen einer Konsolenanwendung des Beispiels 
von der Erstellerseite.

Wenn ihr in "threadpool.h" die Zeile 88 von #if 0 zu #if 1 ändert, 
compiliert das Beispiel und läuft, ansonsten gleicher Fehler wie bei 
mir.
Und leider weiß ich nicht was da zu ändern wäre, vielleicht mal dem 
Ersteller des Threadpools mailen?

Hier nochmal das Beispiel:
1
// example from 
2
// https://github.com/fbastos1/thread_pool_cpp17/
3
4
#include <iostream>
5
#include <vector>
6
#include "threadpool.h"
7
8
int multiply(int x, int y) {
9
  return x * y;
10
}
11
12
int main() {
13
  thread_pool pool(4);
14
  std::vector<std::future<int>> futures;
15
16
  for (const int& x : { 2, 4, 7, 13 }) {
17
    futures.push_back(pool.execute(multiply, x, 2));
18
  }
19
20
  for (auto& fut : futures) {
21
    std::cout << fut.get() << std::endl;
22
  }
23
24
  return 0;
25
}

von Gerader Ast (Gast)


Lesenswert?

Achso, vergessen: Visual Studio 2019 Windows.

von mh (Gast)


Lesenswert?

Gibts nen Grund, warum du nicht auf github um Hilfe fragst? Das ist doch 
geradezu ideal, um nen Issue zu öffnen "Beispiel aus README.ME 
funktioniert nicht mit mvsc 2019". Übrigens der einzig offene Issue hat 
mit genau der Zeile zu tun ...

von Gerader Ast (Gast)


Lesenswert?

Oh, danke. Habe da noch nicht nachgeschaut.

von Oliver S. (oliverso)


Lesenswert?

Gerader Ast schrieb:
> die bisher sehr gut tut was sie soll.

Die einfachste Lösung ist allerdings noch viel naheliegender...
Never change a running system

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.