Ich habe einen Vektor von Zeichenfolgen, die eine gemeinsame Ressource ist.Umschalten der Ausführung zwischen 2 Threads in C++, wenn Threads eine Schleife zwischen Mutex sperren und entsperren
std::vector<std::string> vecstr;
Habe 2 Fäden, die parallel laufen:
Thread1: Um Strings geteilt resourse einzufügen.
Thread2: Um die Größe der gemeinsamen Ressource zu berechnen.
std::mutex mt;
void f1()
{
mt.lock();
while(some_condition())
{
std::string str = getStringFromSomewhere();
vecstr.push_back(str);
}
mt.unlock();
}
size_t f2()
{
mt.lock();
while(string_sending_hasEnded())
{
size_t size = vecstr.size();
}
mt.unlock();
}
int main()
{
std::thread t1(f1);
std::thread t2(f2);
t1.join();
t2.join();
}
Meine Frage ist: wenn der t1 Thread die vecstr gemeinsam genutzte Ressource Mutex für die gesamte while-Schleife Dauer gesperrt hält wird, wie die T2 habhaft der gemeinsam genutzten Ressource vecstr zu berechnen es Größe ist? Schaltet die Ausführung zwischen den 2 Threads um oder hängt davon ab, wer Mutex 1st ergreift. Wenn T1 also Mutex hat, wird es erst nach dem Ende der While-Schleife freigegeben. Ist das wahr ? Oder die Ausführung wechselt zwischen den 2 Threads.
Wenn einer der Faden wird um die Ausführung von nicht ermöglicht anderen Thread zu überfallen zu schalt dazwischen dann wie gehen i ein solches Szenario mit while/for-Schleifen in jedem Thread aber beide Fäden muss kontinuierlich ausgeführt werden? Wobei ich beide Threads an weiterschalten möchte. Soll ich innerhalb der While-Schleife sperren und entsperren, so dass jede Iteration Mutex gesperrt hat & entsperrt?
Bedenken Sie, dass die berechnete Größe irgendwie irrelevant ist, d. H. Sie haben nur einen Hinweis darauf, wie groß die Größe der freigegebenen Ressource in der Vergangenheit war. Es ist nicht klar, wie Sie diese Informationen verwenden möchten. – juanchopanza
Da dies die Version mit den Antworten ist, denke ich, sollten wir die andere Version als ein Duplikat davon markieren, anstatt umgekehrt. (** done **) – Galik
was soll dein 'f2()' thread machen? Wie es geschrieben steht, sieht es so aus, als ob es entweder sofort stirbt, ohne überhaupt etwas zu tun (wenn "string sending" nicht "beendet" ist), oder es wird für immer eine Schleife durchlaufen, ohne etwas Nützliches zu tun (wenn "string sending" _has_ "beendet wurde) "). –