C ++ Pass Mutex по ссылке для разных экземпляров

c++ multithreading c++11 thread-safety mutex

549 просмотра

1 ответ

Я хочу разделить мьютекс между различными экземплярами класса, чьи функции выполняются как потоки. Хорошо, как я это написал? (Я не думаю, что мне нужно использовать shared_mutex, хотя это может быть лучшей практикой. Могу ли я передать это таким же образом?)

class A
{
 public:

     // Execute some work that locks some piece of data by acquiring the mutex.
     void execute(std::mutex & myMutex);
}

class B
{

 public:
     void execute(std::shared_ptr<A> a)
     {

        //   Create the Threads for execution.
        //   Changed to correct syntax.
        std::thread t1(&B::runThread, this, a);
        std::thread t2(&B::runThread, this, a);

        t1.join();            
        t2.join();
     };

     void runThread(std::shared_ptr<A> a)
     {
         a->execute(std::ref(theMutex));
     }



 private:

 //   The Mutex to share with the threads.
 std::mutex theMutex;

}
Автор: Specialist89 Источник Размещён: 08.11.2019 11:27

Ответы (1)


0 плюса

Во-первых, опубликованный код не будет компилироваться: он не B::runThread()является staticчленом и, таким образом, принимает неявный объект в качестве аргумента. Вам нужно создать поток, используя что-то вроде этого:

std::thread t(&B::runThread, this, a);

Предполагая, B::theMutexчто защищает ресурс, совместно используемый несколькими потоками, при использовании A::execute()подхода для разделения мьютекса между различными потоками - это то, для чего нужны мьютексы. Поскольку вопрос лишен каких-либо подробностей, нельзя ответить, является ли мьютекс подходящим примитивом синхронизации: в зависимости от фактического использования в A::execute()других подходах может быть более целесообразно избежать сериализации, взаимоблокировок и т. Д.

Использование a std::shared_mutexпо существу во всех случаях является неправильным подходом и, безусловно, не является «лучшей практикой». Ситуации, когда результат std::shared_mutexдействительно приводит к лучшему подходу, крайне редки. На практике я никогда не встречал случая, когда использование чего-либо подобного std::shared_mutexприводило к повышению производительности (я не видел std::shared_mutexв дикой природе, но встречные части POSIX или их обертки я встречал на удивление часто). Вместо этого, это всегда приводило к худшей производительности, чем при использовании обычных std::mutexes, и это приводило к крайне плохому поведению в худшем случае: когда было много изменений (то есть исключительных блокировок), это часто приводило к драматическим остановкам всей системы.

Автор: Dietmar Kühl Размещён: 20.08.2016 06:13
Вопросы из категории :
32x32