소개 : 동기화를 들어, C#을 System.Threading.Monitor
클래스를 제공하는 스레드 동기화 루틴을 제공하는 등 Enter()
, Exit()
, TryEnter()
와 비슷하게.에뮬레이션 C# 잠금 문 C++
private static readonly obj = new Object();
lock(obj) {
...
}
문제점 :
는 또한, 정상적인 실행 흐름 또는 예외로 인해서, 잠금이 임계 코드 블록이 남아있는 경우 파괴 얻는다 확실하게 lock
문가 C에서 ++, 이를 위해 과 std::unique_lock
은 Monitor
클래스에 적용되지 않고 Lockable
개념을 충족하는 유형에 적용됩니다. 그러나이 방법은 구문 적으로 C#이 여러 가지 이유로 구현 한 방법보다 약한 것으로 생각합니다.
재사용 할 수없는 변수 이름으로 로컬 범위를 오염시킵니다.
{
std::unique_lock<std::mutex> lck{ mtx };
...
}
등의 새로운 스코프를 추가하여이 문제를 해결할 수 있습니다.하지만이 표기법이 다소 어색한 것 같습니다. 무엇보다 저를 괴롭게하는 것은이 유효 C++입니다 :
std::unique_lock<std::mutex>{ mtx ]; // note there is no name to the lock!
...
그래서 잠금 보호에 적절한 이름을 잊어에 의해,이 문은하지 않고, 유형 std::unique_lock<std::mutex>
의 "MTX"라는 이름의 변수 선언으로 해석됩니다 아무것도 잠겨있어!
C#에서 C#의 lock
문을 구현하려고합니다. C++ 17에서는이 아주 쉽게 수행 할 수 있습니다
#define LOCK(mutex) if(std::lock_guard<decltype(mutex)> My_Lock_{ mutex }; true)
std::mutex mtx;
LOCK(mtx) {
...
}
Q : 어떻게 C++ 14분의 11 이것을에서 구현할 수 있습니까?
주제가 없지만 지혜로운 단어 : 식별자 (이중 밑줄 포함) [모든 용도로 구현되어 있습니다] (http://eel.is/c++draft/lex.name#3). – StoryTeller
@StoryTeller A'ight, 나는 그저 그 이름이 무엇과도 충돌하지 않을 정도로 불분명한지 확인하기를 원합니다. – Jodocus
아마도 C#과 C++에 완전히 다른 언어가되어서 언어에 맞서지 말아야 할 것입니다. 나는'std :: unique_lock lock {mtx};는 매우 자연스럽지 만'private static readonly obj = new Object();'는 매우 복잡해 보인다. 왜 매크로가 필요하지 않니? :-) –