I jeszcze dopytam, czy korzystanie z jednego obiektu przez parę wątków to nic złego czy raczej unika się tego?
Podstawowa zasada:
Współbieżne działania na tych samych danych przez wiele wątków bez stosowania synchronizacji są bezpieczne tylko wtedy, kiedy wątki jedynie czytają dane.
Jeśli chcesz korzystać z tego samego obiektu, szczególnie przez wartość, to musisz zadbać o blokady (muteksy - obiekty wzajemnego wykluczenia), które zapobiegną przed dostępem w tym samym czasie.
Prosty przykład:
#include <iostream>
#include <vector>
using namespace std;
vector<int> vec;
void zmien_wartosc() {
for(size_t i = 0; i < 10; ++i)
vec.push_back(i);
}
void odczytaj() {
for(auto x : vec)
cout << x << " ";
}
Jeśli chcesz, aby funkcja odczytaj() wykonała się dopiero wtedy, kiedy funkcja zmien_wartosc() zakończy swoje działanie, musisz zastosować blokadę. Możesz wykorzystać np. lock_guard lub unique_lock. W zależności od sytuacji, może być też konieczna blokada rekurencyjna. Do wykorzystania są również zmienne warunkowe, a także atomowe typy danych.
To tylko i wyłącznie zbiór pojęć. Nie byłbym w stanie w jednym poście wytłumaczyć nawet podstaw wielowątkowości i mechanizmów ich obsługi. Najlepszym rozwiązaniem będzie sięgniecie po materiały, jakie są dostępne na internecie i próba zrozumienia tych zagadnień.
PS. Musisz zadbać przy blokadach także o "fałszywe wybudzenia wątków".