2015-02-25 2 views
2

Представьте меня есть метод класса, который содержит критическую область:C++ Прагма OMP критическое (имя)

class A{ 
    public: 
     A(){}; 

     method(){ 
      #pragma omp critical(name) 
       { //do something } 
     } 
} 

Теперь у меня есть два экземпляра A, то есть. A a1 и A a2. Каково поведение от a1.method() и a2.method()? Может ли {//do something} быть выполнен в одновременно?

Ultimatly, я хочу, чтобы запретить одновременный вызов {//do something} на том же экземпляре , но чтобы одновременно вызов {//do something} на другой экземпляр.

+2

'Нить ждет в начале критической области, пока ни один другой поток не выполнит критическую область (в любом месте программы) с тем же именем.« Кажется, достаточно, дополнительная синхронизация не требуется. –

ответ

1

Критический раздел одинаковый для всех экземпляров объекта - только один поток за раз.

Чтобы разрешить различным экземплярам управлять доступом отдельно, используйте мьютекс, принадлежащий экземпляру. Вы можете использовать omp_init_lock() и другие функции omp_xxx_lock(), std::mutex или другую реализацию мьютекса.

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