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?

1
2607 14 luty 2012, 23:10

2 odpowiedzi

Najlepsza odpowiedź

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

  //...
 }
1
jofel 14 luty 2012, 23:30

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>

1
crush 14 luty 2012, 23:18