2014-02-19 1 views
0

멀티 스레딩에 대해서는 거의 알지 못합니다. 그러나 다른 프로그래머와 협력 중이며 원래 프로그래머는 더 이상 필요하지 않기 때문에 도움이 필요합니다.뮤텍스/멀티 스레딩/공유 리소스 문제 WinAPI

프로그램은 그것을 실행하는 자체 exe를 가지고 있지만 DLL은 APIENTRY (WINAPI)를 통해 다른 프로그램의 프로세스에 연결됩니다 ... DLL이 프로세스에 연결되면 몇 개의 뮤텍스가 생성됩니다. 문제는 이러한 뮤텍스 중 하나를 한 번만 만들어야하며 각 프로세스에서 액세스 할 수 있어야한다는 것입니다. 각 프로세스가 자체 핸들을 작성하는 것을 막을 수는 없습니다. 적어도 일부 작업 중에는 핸들을 다른 프로세스로 전달하거나 각 프로세스에서 각 핸들을 가져와 동일한 작업을 적용 할 수 있어야합니다 (기본적으로 일부 변수를 동기화하는 경우). 이전 정적 bool isFirst 접근 방식을 시도했지만 각 프로세스는 새로운 변수 집합을 만들어서 작동하지 않습니다.

나는 정말 혼란스럽고 좌절하고 있습니다. 어떤 생각이나 아이디어라도 높게 평가 될 것입니다.

답변

1

프로세스가 연결될 때마다 (정확한 이름을 기억하지 못해 죄송합니다) DLL을 연결하는 메커니즘이 있으며 DLL이로드 될 때 호출되는 InitInstance가 별도로 있습니다. 그래서 뮤텍스가 DLL로 정적 전역을 처리하게 만들면 InitInstance에있는 뮤텍스를 생성하고 iinitialise하고 뮤텍스 핸들을 요청하는 모든 프로세스에 핸들을 전달하면 더 잘 수행해야합니다.

+0

감사합니다. 도움이됩니다. 뮤텍스 핸들을 "넘겨주는"특별한 방법이 있습니까? DLL에서 정적 핸들을 만들었고 (handle1이라고 부름), 권고 한대로 WaitForSingleObject (handle1, INFINITE)를 사용했습니다 ... 여전히 개별 프로세스가 다른 핸들을 사용하고있는 것처럼 보입니다 ... – Paul

+0

그래서. 확인하기 만하면 InitInstance에서 CreateMutex를 호출하여 뮤텍스를 만들고 핸들을 가져옵니다. 그렇습니까? 주어진, 나는 GetMutex() {return g_hMutex;} 함수를 만들어서 다른 프로세스가 호출 할 수있는 DLL에 만들 것이다. DLL에서 WaitForSingleObject를 호출하고 있습니까? 왜 그렇게하고 싶은지 모르겠다. 중요한 것은 WaitForxxxx **를 통해 뮤텍스의 소유권을 가진 프로세스는 다른 프로세스가 가져올 수 있도록 ReleaseMutex (핸드)를 호출해야한다는 것입니다. 그거하고 있니? –

+0

InitInstance가 MFC가 아니기 때문에 호출되지 않은 것을 발견했습니다. WinMain으로 초기화 (g_hMutex = CreateMutex (0,0,0);)를 옮겼습니다. WaitForSingleObject는 DLL의 함수 내에서 호출됩니다. 왜? 확실하지는 않습니다. 원래 프로그래머가이 작업을 수행했습니다. 나는 그것이 우리가 실제로 붙잡고있는 프로세스에 대한 제어권을 가지고 있지 않기 때문에 (나는이 문장에 너무 혼란 스럽다.) – Paul

0

개별 DLL 세그먼트가 생성되어 별도의 데이터 세그먼트가 생성되는 것으로 보입니다. data_seg를 사용하여 인스턴스간에 동일한 값으로 핸들을 가져올 수있었습니다. 이제 mutex가 동시 쓰기로부터 보호하고있는 실제 변수 (벡터 객체)에 data_seg를 사용할 수 없기 때문에 새로운 문제가 있음을 알게되었습니다.