je testais au hasard std::thread
dans ma machine virtuelle Linux (GCC 4.4.5-Debian) avec ce programme de test:Question sur les références de la fonction et les fils
#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;
}
Pourquoi vecteur test
reste vide? Est-ce que je fais quelque chose de stupide avec des références (probablement) ou est-ce quelque chose avec bind
ou un problème de threading?
Merci!
MISE À JOUR: avec l'aide combinée de Kos et villintehaspan I "fixe" le "problème":
#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;
}
qui imprime toutes les valeurs pour et semble fonctionner OK. Maintenant, une seule question demeure: est-ce juste chanceux (aka undefined behaviour (TM)) ou est la variable statique provoquant un pas silencieux de type mutex dans le code? PS: Je comprends le problème de "tuer le multithread" ici, et ce n'est pas mon point de vue. J'essaye juste de tester la robustesse de la fonctionnalité std::thread
de base ...
Vous avez raison: l'affiche doit empêcher l'accès multithread aux variables. C'est la contrainte qui est le problème ici, mais je vote +1 car ce sera un problème après que la liaison est fixée. – villintehaspam
Eh bien, il semble que l'appel 'thread (f, test)' utilise quelque chose comme 'bind' en interne, parce que je reçois le comportement de copie de vecteur ici aussi. (aussi: trop mauvais 'std :: thread' n'est pas disponible pour mingw ... le projet mingw-w64 travaille dessus, mais ce n'est pas encore fini :() – rubenvb
Utile, merci beaucoup! – Tianyi