Je veux calculer deux choses dans deux fils où chacun d'eux a une boucle sans fin. Ces deux ne dépendent pas l'un de l'autre.Faire le même fil avec la boucle pas obtenir le même mutex encore et encore sans sommeil
De plus, je veux aussi une sortie sur le terminal dans une boucle sans fin (il suffit de recommencer chaque fois que la dernière sortie a été calculée, pas d'étape entre les deux). Par conséquent je veux des copies locales des variables globales (deux itérations consécutives du premier calcul et une valeur du deuxième calcul) toutes dans un état sûr.
Le problème est maintenant que je dois ajouter un peu de sommeil aux deux calculs pour obtenir une sortie de func1. J'ai vérifié l'utilisation du processeur et le sommeil l'abaisse définitivement. Comment puis-je contourner ce problème?
Voir aussi les commentaires pour les tests:
#include <iostream>
#include <thread>
#include <condition_variable>
#include <mutex>
int n(0);
long s(1234);
double t(56.78);
std::condition_variable cond;
std::mutex m1;
std::mutex m2;
void func1() {
while (true) {
// Not needed due to wait unlocking the mutex
//std::this_thread::sleep_for(std::chrono::nanoseconds(1));
std::unique_lock<std::mutex> lck1(m1);
cond.wait(lck1);
int n1(n);
long s1(s);
cond.wait(lck1);
int n2(n);
long s2(s);
lck1.unlock();
std::unique_lock<std::mutex> lck2(m2);
double ti(t);
lck2.unlock();
// calculate and print some output
std::this_thread::sleep_for(std::chrono::milliseconds((n1*n2)/2));
std::cout << n1 << ":" << s1 << ", " << n2 << ":" << s2 << ", " << ti << std::endl;
}
}
void func2() {
while (true) {
// Why do I need this to make func1 ever proceed (ok, really seldom and random func1 got the mutex) and
// how to work around this without sleep lowering time for computations?
std::this_thread::sleep_for(std::chrono::nanoseconds(1)); // comment out to test
std::unique_lock<std::mutex> lck1(m1);
n++;
// do some stuff taking some time with s
std::this_thread::sleep_for(std::chrono::milliseconds((n*n)/3));
cond.notify_all();
}
}
void func3() {
while (true) {
// Why do I need this to make func1 ever proceed (it got the mutex never ever) and
// how to work around this without sleep lowering time for computations?
std::this_thread::sleep_for(std::chrono::nanoseconds(1)); // comment out to test
std::unique_lock<std::mutex> lck2(m2);
// do something taking some time with t
std::this_thread::sleep_for(std::chrono::seconds(2));
}
}
int main() {
std::thread t1(func1);
std::thread t2(func2);
std::thread t3(func3);
t1.join();
t2.join();
t3.join();
return 0;
}
Il semble que vous voulez que t3 déclenche t1 et t2, puis que t1 et t2 déclenchent t3. Vous pouvez utiliser 4 mutex, m1 pour t1, m2 pour t2, m31 et m32 pour t3. t1 attend m1, fait son travail et libère m31. t1 attend m2, fait son travail et libère m32. t3 attend m31 puis m32, fait son travail, puis relâche m1 et m2. – rcgldr
S'il vous plaît signaler le code runnable real buildable qui reproduit votre problème. Lisez à propos de la publication d'un [mcve]. –
@rcgldr L'idée est sympa, mais elle ne m'assure pas que j'obtiens deux valeurs consécutives. Ou peut-être que je me suis trompé. –