ich zufällig std::thread
in meiner virtuellen Linux-Maschine (GCC 4.4.5-Debian) mit diesem Testprogramm Testen wurde:Frage zum Funktionsreferenz und Themen
#include <algorithm>
#include <thread>
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
static int i=0;
void f(vector<int> &test)
{
++i;
cout << "Push back called" << endl;
test.push_back(i);
}
int main()
{
vector<thread> t;
vector<int> test;
for(int i=0; i<1000; ++i)
{
t.push_back(thread(bind(f, test)));
}
for(auto it = t.begin(); it != t.end(); ++it)
{
(*it).join();
}
cout << test.size() << endl;
for(auto it = test.begin(); it != test.end(); ++it)
{
cout << *it << endl;
}
return 0;
}
Warum Vektor test
leer bleiben? Mache ich etwas Dummes mit Referenzen (wahrscheinlich) oder ist es etwas mit bind
oder ein Threading-Problem?
Danke!
UPDATE:
#include <algorithm>
#include <thread>
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
static int i=0;
void f(vector<int> &test)
{
++i;
test.push_back(i);
}
int main()
{
vector<thread> t;
vector<int> test;
for(int i=0; i<1000; ++i)
{
t.push_back(thread(f, std::ref(test)));
}
for(auto it = t.begin(); it != t.end(); ++it)
{
(*it).join();
}
cout << test.size() << endl;
for(auto it = test.begin(); it != test.end(); ++it)
{
cout << *it << endl;
}
return 0;
}
, die alle Werte um druckt und scheint gut zu funktionieren: mit der kombinierten Hilfe von Kos und villintehaspan ich das "Problem" "fixiert". Jetzt bleibt nur eine Frage: Ist das nur ein Glück (undefiniertes Verhalten (TM)) oder ist die statische Variable ein stiller Mutex-ähnlicher Schritt im Code?
PS: Ich verstehe das Problem "Multithreadingness" hier, und das ist nicht mein Punkt. Ich versuche nur, um die Robustheit der grundlegenden std::thread
Funktionalität zu testen ...
Sie haben Recht, dass das Poster Multithread-Zugriff auf die Variablen verhindern soll. Es ist die Bindung, die hier das Problem ist, aber ich stimme +1, da dies ein Problem sein wird, nachdem die Bindung behoben wurde. – villintehaspam
Nun, es scheint, dass der 'thread (f, test)' Aufruf intern so etwas wie 'bind' verwendet, weil ich auch hier das Vektorkopierverhalten bekomme. (auch: zu schade 'std :: thread' ist nicht für mingw verfügbar ... das mingw-w64 projekt arbeitet daran, aber es ist noch nicht fertig :() – rubenvb
Hilfreich, vielen dank! – Tianyi