Вот довольно злой, но работает, хак:
#include <memory>
#include <mutex>
#include <iostream>
#define with(m) for (std::unique_ptr<std::lock_guard<std::mutex>> lock(\
new std::lock_guard<std::mutex>(m)); lock; lock.reset())
int main()
{
std::mutex m;
with (m)
{
std::cout << "got the mutex" << std::endl;
}
}
with(m)
расширяется заголовок for
петли, которые
- создает
unique_ptr
к lock_guard
, который держит mutex
- в условии цикла, проверяет, что указатель не равен нулю
- в части приращения сбрасывает указатель.
Точно так же, как и при выполнении блокировки, происходит выполнение цикла, следующего за макросом with()
. Немного взломать из-за макроса и указателя, но тем не менее немного чище, чем конструирование цикла while
и переключении состояния мьютекса.
Если у вас есть C++ 14, вы можете немного упростить макрос, используя std::make_unique
. Если вы можете использовать C++ 17, Quentin's solution будет более элегантным.
Конечно, на самом деле это не C++-способ сделать это, просто взломать какой-то синтаксический сахар. Таким образом, если вы действительно настаиваете на следующий синтаксис Python-как, вы могли бы просто использовать стандартный C++ способ использования lock_guard
так:
{
std::lock_guard<std::mutex> lock(my_mutex);
// Do whatever
}
Не могли бы вы вместо того, чтобы обеспечить пример Python с ' с 'и мьютексом, который вы хотели бы иметь на C++? – michalsrb
Что вы хотите, чтобы значение 'sync()' было? просто переключить замок? –
Плохой дизайн требует плохого кода. Там не должно быть необходимости ** ** для блокировки переключения. – SergeyA