Jestem nowy w programowaniu wielowątkowym, proszę nie śmiej się, jeśli wydaje się to zbyt proste.
Mam prosty obiekt klasy, który ma kilka zmiennych składowych, np.
class XYZ
{
public:
int a;
int b;
...
};
Xyz to obiekty współdzielone przez wiele wątków, jaki jest najlepszy sposób współdzielenia „a” między wieloma wątkami? Na przykład,
W wątku A zrobię coś takiego
xyz.a = xyz.a + rand();
W wątku B zrobię coś takiego
xyz.a = xyz.a - rand();
Słyszałem o stworzeniu muteksu jako członek klasy, czy ktoś może podać prosty przykład, jak to zrobić.
Jak mogę stworzyć interfejs klasy, który pozwala wielu wątkom na bezpieczny dostęp do swojego członka?
2 odpowiedzi
Możesz użyć muteksu. Mogą być blokowane tylko przez jeden wątek jednocześnie.
class XYZ
{
int a,b;
boost::mutex mutex;
}
Następnie użyj kodu wątku
void thread(XYZ *xyz)
{
//....
// now a member of xyz should be accessed/changed.
{
boost::unique_lock<boost::mutex> lock(xyz->mutex); // lock first the mutex
// do something with members of xyz
// ...
} // mutex automatically freed because lock object destroyed
//...
}
Jeśli używasz wskaźników, możesz użyć boost::shared_ptr<O>
(gdzie O jest twoją klasą obiektu wskaźnika).
W przypadku tych wartości możesz użyć: boost:atomic<int>
Podobne pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .