Hi,
ich bin gerade bei einer Fingerübung an eine neue Hürde gestoßen, die ich allein nicht so recht zu umschiffen verstehe.
Folgendes Szenario; die Funktion
std::string watch_mail(const std::string spool) ;
soll meine Mailordner durchgehen und bei vorhandener neuer Mail Ordner und Anzahl mittels
void check_folder(std::string spool,const std::string Folder,std::map<std::string,std::string>& Mailbox) ;
in
std::map<std::string,std::string> Mailbox
ablegen. Das klappt seriell wunderbar. Nun wollte ich aber einmal schauen wie das parallel funktioniert und ob man etwas spürbar an der Performance regelt.
Hierfür wird die serielle Variante:
getdir(spool,Folder);
for(std::vector<std::string>::iterator Folder_it = Folder.begin();Folder_it!=Folder.end(); Folder_it++)
{
check_folder(spool,*Folder_it,Mailbox) ;
}
in die parallele Version umgemünzt.
std::vector<std::string>::iterator Folder_it = Folder.begin() ;
std::thread T[Folder.size()] ;
for(uint i=0; i!=Folder.size(); i++)
{
T[i] = std::thread(check_folder,spool,*(Folder_it++),Mailbox) ;
}
for(unsigned int i = 0; i != Folder.size(); i++)
{
T[i].join() ;
}
Leider bricht mir g++ mit folgenden Fehler ab, was ich nur bedingt nachvollziehen kann:
g++ mail.cpp
In file included from /usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/bits/move.h:57:0,
from /usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/bits/stl_pair.h:61,
from /usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/bits/stl_algobase.h:65,
from /usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/bits/char_traits.h:41,
from /usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/ios:41,
from /usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/ostream:40,
from /usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/iostream:40,
from ./mail.h:6,
from mail.cpp:1:
/usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/type_traits: In Instanziierung von »struct std::_Result_of_impl<false, false, void (*)(std::basic_string<char>, std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> >&), std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >«:
/usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/type_traits:1857:12: erfordert durch »class std::result_of<void (*(std::basic_string<char>, std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> >))(std::basic_string<char>, std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> >&)>«
/usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/functional:1563:61: erfordert durch »struct std::_Bind_simple<void (*(std::basic_string<char>, std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> >))(std::basic_string<char>, std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> >&)>«
/usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/thread:133:9: erfordert durch »std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(std::basic_string<char>, std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> >&); _Args = {const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&}]«
mail.cpp:23:59: von hier erfordert
/usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/type_traits:1834:9: Fehler: ungültige Initialisierung einer nicht-konstanten Referenz des Typs »std::map<std::basic_string<char>, std::basic_string<char> >&« von R-Wert des Typs »std::map<std::basic_string<char>, std::basic_string<char> >«
make: *** [mail.o] Fehler 1
Press return ...
Dass Mailbox nicht konstant ist, hat für mein Verständnis einen ersichtlichen Grund. Immerhin sollen neue Einträge in dieser map-Variable angelegt werden.
Wie ist das denn zu umschiffen, sodass ich weiterhin mit der Adresse von Mailbox arbeiten kann, um diese Variable nicht jedes Mal neu erzeugen zu müssen. Übersehe ich etwas ?
Besten Dank für eure Hilfe!
L-K