2016-08-01 6 views
1

У меня есть структура данных, которая не поддерживает поток. Несколько потоков считывают и записывают эту структуру данных в 2 метода. (Порядок вызовов довольно случайным образом) Мой подход к этой проблеме был использованием unique_lock, как показано ниже:C++ блокировка между методами

struct test { 

    void func1() { 
    boost::unique_lock<boost::mutex> lock(_mutex); 
    // modify data-structure 
    } 


    void func2() { 
    boost::unique_lock<boost::mutex> lock(_mutex); 
    // modify data-structure 
    } 

    boost::mutex _mutex; 
} 

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

Должен ли я использовать повышение :: unique_lock в обоих методах и затем позвоните по телефону

lock() 
unlock() 

на это?

+0

Вместо этого используйте ['boost :: scoped_lock'] (http://www.boost.org/doc/libs/1_61_0/doc/html/boost/interprocess/scoped_lock.html). –

+2

Вы также можете использовать 'std :: mutex' и' std :: lock_guard' для этого случая. Нет необходимости использовать boost для всего, что находится в STL – alexeykuzmin0

+0

@JoachimPileborg Почему это имеет значение в этом случае? 'Scoped_lock' должен быть заменен на' unique_lock'. – Jens

ответ

0

блокирующий механизм, как описано, не был причиной ошибки.
Ну, на самом деле это было;)
Вне критической секции я назвал

datastructure.empty() 

, потому что в более ранней версии этот метод был threadsave.

Благодаря «Kerrek SB» для указания на ниток-sanitizer, так как он выводит меня к ошибке.

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