C wurde nicht für Multithreading entwickelt, daher ist das Verhalten von srand() bei Multithreading nicht definiert und hängt von der C-Laufzeitbibliothek ab.
Viele Unix/Linux C-Laufzeitbibliotheken verwenden einen einzigen statischen Zustand, auf den von mehreren Threads aus nicht sicher zugegriffen werden kann. Daher können Sie mit diesen C-Laufzeitbibliotheken srand() und rand() von mehreren Threads aus überhaupt nicht verwenden. Andere Unix-C-Laufzeitbibliotheken verhalten sich möglicherweise anders.
Die Visual C++-Laufzeit verwendet einen internen Zustand pro Thread, so dass es sicher ist, srand() für jeden Thread aufzurufen. Aber wie Neil schon sagte, werden Sie wahrscheinlich alle Threads mit demselben Wert seeden - also seeden Sie stattdessen mit (time + thread-id).
Aus Gründen der Übertragbarkeit sollten Sie natürlich Random-Objekte statt der Rand-Funktion verwenden, dann sind Sie nicht von einem verborgenen Zustand abhängig. Sie brauchen immer noch ein Objekt pro Thread, und jedes Objekt mit (time + thread-id) zu bestücken ist immer noch eine gute Idee.