여러 스레드에서 만들 수있는 클래스가 있습니다. 하지만 하나의 함수에서 코드를 보호해야하므로 boost 프로세스 간 뮤텍스를 사용하기로 결정했습니다. 모든 클래스는 만들거나 그것의 생성자에서 같은 뮤텍스를 엽니 다named_mutex를 부스트하고 remove() 명령을 사용합니다.
이MyClass::MyClass()
{
boost::interprocess::named_mutex m_Lock(
boost::interprocess::open_or_create, "myLock");
}
그래서 지금 중요한 코드 부분이 호출되는 시점이 온다 : (
int MyClass::MyFunction()
{
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(
m_Lock, boost::interprocess::try_to_lock);
if(!lock)
{
return -1;
}
// else do some stuff here
}
함수 후 정리하려면를하고 싶은 그 사실 모든 코드가 잘 작동
MyClass::~MyClass()
{
boost::interprocess::named_mutex::remove("myLock");
}
하지만 내가 가진 하나의 문제가있다 :
0 내 클래스 소멸자에서 삭제 명령을 사용하여) 부스트 페이지에 설명시스템에서 명명 된 뮤텍스를 삭제합니다 : 그것이 제거 명령의 설명에서 말했다됨에 따라
. 오류가 발생하면 false를 반환합니다. 절대 던지지 마. 다른 스레드가 그냥 잠긴 경우에도 (이미이 사건을 시도 - - 그것은 더 이상 다음 잠겨 있지)
은 그래서 remove 명령은 단지 시스템에서 뮤텍스가 삭제 의미한다. 그래서 내 문제는 다음입니다 : 내가 가진 예를 들어 3 스레드 (A, B 및 C) - 이제 다음과 같은 일이 발생 :
- 프로세스 A는 클래스의 인스턴스를 생성하는 함수를 호출하고 그것을 고정
- 프로세스 B는, 클래스의 인스턴스를 생성하는 함수를 호출하지만 코드에 액세스 할 수 없습니다 (대기합니다 예)
- 프로세스 A는 보호 된 코드를 완료하고이 보호 된 코드
- 프로세스 B 이득 액세스의 잠금이 해제됩니다 그것을 잠급니다.
- 가공 ■ 클래스의 인스턴스를 삭제합니다. -> remove 명령이 호출됩니다.
- 프로세스 C가 클래스의 인스턴스를 만들고 함수를 호출하며 제거 명령이 뮤텍스 -> 오류를 지웠으므로 코드에 액세스 할 수 있습니다.
그럼 이제 누군가가 "그럼 전화를 걸지 마!"라고 말할 수 있습니다. 나는 named_mutex가 시스템에 쓴 이후로 프로그램이 종료 되더라도 명시 적 호출없이 지워지는 것을 의심한다. 누구나 도움이 필요합니까?
귀하의 질문과 "스레드"및 "프로세스"의 상호 사용에 혼란 스럽습니다. 어느 상대인가? 스레드? 또는 프로세스? 일반적으로 명명 된 mutis는 단일 프로세스 내에서만 멀티 스레드 된 경우 매우 큰 유용성을 갖습니다. –
죄송합니다. 나는 글씨를 쓰는 동안 조금 혼란 스러웠습니다. 사실 나는 다른 프로세스를 가지고있다. 앞에서 말했듯이 스레드 만 있으면 이름 지정된 뮤텍스를 실제로 사용할 필요가 없습니다. – Toby