개체 생성 중 일부 코드를 동기화하기 위해 뮤텍스를 사용하는 C# 응용 프로그램 코드가 있습니다. 객체 생성자는 뮤텍스를 획득하고 객체가 더 이상 필요하지 않을 때 (앱 종료 도중)에만 뮤트를 해제합니다. 따라서 뮤텍스를 해제 할 곳은 객체 소멸자입니다. 문제는 개체 소멸자에서 ReleaseMutex()를 호출하는 중에 예외가 발생한다는 것입니다. 예외는 "비동기 코드 블록에서 객체 동기화 메소드가 호출되었습니다"입니다. 개체 소멸자를 호출하는 gabage 컬렉션을 수행하는 스레드가 처음에는 뮤텍스 (Mutex.WaitOne (false, namedMutex))를 기다리는 동일한 스레드가 아닌 것으로 나타납니다. 이 예외를 피하기 위해 동일한 스레드에서 뮤텍스의 획득과 해제를 어떻게 동기화합니까? 당신의 도움을 주셔서 감사합니다!뮤텍스를 사용하여 C# 개체 동기화 "동기화되지 않은 코드 블록에서 개체 동기화 메서드가 호출되었습니다."오류
public class MyObject
{
static ExtDeviceDriver devDrv;
private Mutex mut = new Mutex(false,myMutex);
public MyObject()
{
mut.WaitOne();
//Thread safe code here.
devDrv = new ExtDeviceDriver();
}
~MyObject()
{
mut.ReleaseMutex();
}
}
뮤텍스 보호 란 무엇입니까? 경쟁이란 무엇입니까? 예를 들어, 앱 종료시에만 출시되므로 아무 것도하지 않고 프로세스 종료로 해제 할 수 있습니까? –
이것은 올바른 이유로 잘못된 것을 사용하거나 그 반대의 경우입니다. 잊었다. 어떤 경우 든 동기화 객체를 획득하여 자신의 스레드에서 릴리스해야합니다. 객체의 사용은 실제로 발생한다는 것을 결코 보장 할 수 없다는 것을 의미합니다. 다른 말로하면, 당신의 객체를 생성 한 스레드 (그리고 뮤텍스)가 사라질 수도 있습니다. 더 이상 존재하지 않고 하늘에있는 ThreadPool에서 평생 동안 평온하게 쉬는 것입니다. 앱이 이미 실행 중임을 알 수 있도록 뮤텍스를 획득하는 경우 뮤텍스를 릴리스 할 이유가 없습니다. 그렇지 않으면 [cont'd] –
[계속] 더 많은 정보를 제공하십시오. 그러면 어쩌면 우리가 무엇을하려고하는지 알 수 있습니다. –