Musisz podać funkcję generatora liczb losowych lub obiektu funktora, który przyjmuje typ wartości integralnej i zwraca inną wartość jakiegoś typu integralnego, która nie przepełni granic kontenera, że iteratory, które przekazałeś do funkcji, są iterowanie przez. Również w przypadku obiektu functor musi on implementować operator()
, aby można było go nazwać jak funkcję. Ponieważ potrzebujesz generatora liczb losowych bezpiecznych dla wątków, używanie srand
iz cstdlib
jest złym pomysłem ... powinieneś zamiast tego utworzyć obiekt funktorowy, który implementuje generator liczb losowych bezpieczny dla wątków lub generator liczb losowych, który nie implementuje globalnie dostępnych zmiennych, dzięki czemu wszystko pozostaje w pamięci lokalnej.
Na przykład, jednym ze sposobów, w jaki może to działać, jest generator liczb losowych, który uzyskałeś z innej biblioteki, która generuje tylko wartości losowe między ustalonym zakresem wartości, dzięki czemu możesz zdefiniować granice kontenera dla iteratorów o dostępie swobodnym używany jest algorytm random_shuffle
. Teraz w zależności od tego, co biblioteka użyć, można funktor wyglądać mniej więcej tak:
class my_rand_gen
{
private:
random_gen_type random_range_gen;
int min;
int max;
public:
my_rand_gen(const random_gen_type& gen, int min_range, int max_range):
random_range_gen(gen), min(min_range), max(max_range) {}
int operator()(int value)
{
//ignore the input value and use our own defined range
//returns a value between min and max
return random_range_gen(min, max);
}
};
teraz można nazwać algorytmu takiego:
random_shuffle(my_vector_start_iter, my_vector_end_iter,
my_rand_gen(rand_generator_lib,
vector_start_index,
vector_end_index));
i będzie przetasować wektor w między początkiem i kończ iteratory do twojego wektora bez przepełnienia granic wektora ... innymi słowy użyje tylko wartości dla przetasowania pomiędzy vector_start_index
i vector_end_index
.
Generalnie trzeba zrobić założenie, że * nie * w bibliotece C++ to Wątek bezpieczny, chyba że dokumentacja stanowi inaczej. –
Również "Threadafe" to termin bardzo przeciążony. Niektóre algorytmy są bezpieczne tylko wtedy, gdy działają na bezpiecznych danych. Niektóre są bezpieczne dla wszystkich wątków, o ile istnieje tylko 1 scenarzysta, a większość nie może tego zagwarantować. Zasadniczo przy podejmowaniu decyzji o tym, co jest bezpieczne (tj. Poprawne), wymagane jest określenie różnych wymagań odczytu/zapisu. – Kylotan
Aby wyjaśnić, chcę równolegle tasować różne listy.Nie martwię się więc o wyścigi w strukturze danych, tylko generowanie losowych liczb dla shuffle. – Mark