мьютекс как член класса - PullRequest
9 голосов
/ 10 мая 2011
 class temp
 {
    boost::mutex mx;
    void CriticalCode() {
        boost::mutex::scoped_lock scoped_lock(mx); 
        //Do Something
        return;
    }
 }
  1. Если этот класс размещен в куче (temp* T = new temp()), будет ли это потокобезопасным (для каждого экземпляра, а не для всех экземпляров вместе)?

  2. Если я сделаю boost::mutex mx -> boost::mutex* mx и выделю его в конструкторе, чтобы он был размещен в куче, будет ли код также безопасным для потоков?

  3. Если ответ на 1 и 2 - нет, как я могу сделать каждый экземпляр потокобезопасным?

Ответы [ 3 ]

8 голосов
/ 10 мая 2011

1) если этот класс размещен в куче (temp * T = new temp ()), будет ли это потокобезопасным (для каждого экземпляра, не для всех экземпляров вместе?

Да. Так как mx не является статическим членом класса, будет одна блокировка для экземпляра класса.

2), если я сделаю boost :: mutex mx -> boost :: mutex* mx, и выделите его в конструкторе, чтобы он был размещен в куче, будет ли код также поточно-ориентированным?

Да.Но потокобезопасен только для каждого отдельного экземпляра.

3) если теперь ответ на 1 и 2, как я могу сделать каждый экземпляр поток безопасным?

Ответы да, так что вы в порядке.

В случае, если кто-то еще задается вопросом, как сделать все экземпляры потокобезопасными с помощью одной блокировки - вы можете сделать mx статической переменной класса.

3 голосов
/ 10 мая 2011

Место хранения не имеет ничего общего.

0 голосов
/ 10 мая 2011

Да, метод CriticalCode() будет потокобезопасным в обоих случаях.

...