2013-10-08 3 views
1

Предположим, что существует определенный пользователем класс MyClass, у которого есть сеттер и функция геттера.Синхронизация C++ (CAS-like) на геттере и сеттер пользовательских типов

class MyClass { 
    int m_value; 
    public: 
     void set(int value) 
     { m_value = value; } 

     int get() const 
     { return m_value;} 
}; 

И есть функция increment(), что может увеличить стоимость объекта на 1, которое может быть использовано в нескольких потоках.

void increment(MyClass& myClass) 
{ 
    myClass.set(myClass.get() + 1); 
} 

Каков наилучший способ обеспечения безопасности этой функции? Просто используя замок? Есть ли способ достичь этого, используя некоторые операции, подобные CAS?

+0

Это маловероятно, что вам нужно Atomics, и они могут быть даже медленнее, лучше всего защитить данные класса с помощью мьютекса. – goji

+0

Вы можете, конечно, добавить метод myClass :: increment(). –

ответ

2

Если вы используете C++ 11, вы могли бы просто использовать std::atomic<int>, который обеспечивает атомное load, store и increment, который, кажется, все, что вам нужно.

Я подозреваю, что вам не нужны атомы, хотя в большинстве случаев они будут медленнее, чем ваш основной мьютекс.

Посмотрите это другой question, прежде чем принимать решение.

+0

Я не думаю, что 'std :: atomic ' будет работать, потому что я использую определенный пользователем тип. Спасибо за совет и ссылку. – user571470

+0

Итак, ваше единственное решение - это защитить его мьютексом. Упрощает решение;) – goji

+0

Я также хочу использовать std :: atomic внутри вашего MyClass. Если это то, что вы подразумеваете под определенным пользователем типом. – goji

-3

Использование станд :: мьютекс и наслаждайтесь

#include <mutex> 

    class MyClass 
    { 
     int m_value; 
     std::mutex mtx; 

     void set(int value) 
     { 
      mtx.lock(); 
      m_value = value; 
      mtx.unlock(); 
     } 

     int get() const 
     { 
      return m_value; 
     } 
    } 
+0

Это не сработает. 'Increment()' по-прежнему не является потокобезопасным. – user571470

+0

Это сломано. – goji

+0

increment() не требует потокобезопасности, поскольку функция MyClass.set является потокобезопасной. – Ronaldinho

 Смежные вопросы

  • Нет связанных вопросов^_^