?
Mal unter der Annahme ich habe verstanden, was Du wirklich machen willst:
* Du hast n-Threads
* n-1 Threads erzeugen Daten
* 1 Thread liest diese Daten
* zwischen erzeugen der Daten und deren "Gültig" werden soll pro Thread eine bestimmte Zeitspanne liegen. Diese Zeitspanne ist aber nur für den Thread relevant, d.h. es liegt keine gemeinsame Zeitskala zu grunde.
Dann würde ich das so lösen, dass jeder der n-1 Threads einen vector<data> bekommt, in die er die Daten schreibt, jeder Thread hat außerdem ein Semaphor, dass er vor Beginn der Bearbeitung anfragt ("acquire"). Nach dem Ende der Schlafenszeit gibt er das Semaphor wieder frei ("release"), was gleichzeitig die Gültigkeit der Daten markiert. Der Hauptthread prüft, ob er eine der n-1 Semaphoren bekommen kann ("tryAcquire"), wenn ja, werden die Daten bearbeitet (versendet). Danach gibt er das Semaphor wieder frei, so dass der betreffende thread sich das wieder holen kann und das Spiel beginnt von vorn. Dabei brauchst Du aber noch ein zusätzliches Element, z.B. pro Thread einen Zähler, so dass der Lesethread, wenn er das Semaphor hat, schauen kann, ob neue Daten vorliegen.
Grob gesagt:
vector<Semaphore> semaphores; // müssen z.B. alle auf 0 initialisiert werden
// größe = Anzahl Erzeugerthreads, sie dienen
// gleichzeitig dem Zugriffsschutz auf newData und data[i]
vector<bool> newData; // Zeigt an, ob neue Daten vorliegen
vector<vector<threadData>> data; // Daten der einzelnen Threads
// ggf. muss hier noch ein Lock her, da mehrere
// threads in diese Struktur schreiben, oder man legt n-1 einzelne Variablen an.
// im main-thread
while (!shallTerminate())
{
for(size_t i = 0; i < semaphores.size(); ++i)
{
if (semaphores[i].tryAcquire())
{
if (newData[i] == true)
{
// verarbeite Daten die im data-Vector an der Position des Threads stehen
newData[i] = false;
}
semaphores[i].release();
}
sleep(someMillisecs);
}
}
// in jedem DatenThread
size_t dataThreadID; // auf die Position im Vector initialisiert
while (!shallTerminate())
{
if(semaphores[i].tryAcquire())
{
if (newData[i] == false) // sind die Daten schon abgeholt
{
// erzeuge Daten die im data-Vector an der Position des Threads stehen
newData[i] = true;
}
else
{
// potenzielle Fehlerbehandlung, weil Daten nicht schnell genug abgeholt wurden
}
sleep(timeout);
semaphores[i].release();
}
}