프로세스 간 동기화(상호 배척) 및 동일한 DLL의 다른 프로세스 copy 공유 글로벌 변수

2772 단어 nulldlllinker
이전에 문제가 발생했습니다. 서로 다른 AP에 호출될 수 있는 COM 구성 요소를 실현하려면 동기화를 유지해야 합니다.비교적 좋은 방법은 ATL을 이용하여singleton의Com부품을 실현하는 것이다. 유감스럽게도 이 부분은 익숙하지 않다. 다만 코드프로젝트의 Sample'조롱박'에 따라 바가지를 그렸다.쓸 수 있을 것 같고 대략적인 절차도 분명해 보이지만 ATL 하면 전혀 못 봤어요.
그래, 서로 밀어붙이면 돼. 간단하게, 일반적인 COM 구성 요소/DLL을 실현하고, 프로세스 간의 밀어붙이기를 이용하여 동기화를 실현하자.프로세스 간에 서로 밀어붙이는 방법은 매우 많은데 메모리 파일의 매핑, 신호량 등을 포함한다. 보통 신호량을 사용하는데 신호량의 종류가 매우 많다. 예를 들어mutex, 이벤트,criticalsection 등이다.여기에는 mutex를 예로 들어 프로세스 간의 상호 배척을 간단하게 실현했다.
상호 배척의 핵심 사상은 공유된 신호량을 만드는 것이다. 하나의 프로세스만 독점할 수 있고, 이미 하나의 프로세스가 독점할 때, 다른 프로세스는 이 신호량을 점용한 프로세스가 그를 방출할 때까지 기다려야 한다.프로세스 간에 특정한 신호량을 공유할 수 있는 이유는 신호량이 하나의 내부 핵 대상이기 때문이다. 프로세스에서 볼 수 있는 것은 그가 특정한 프로세스 공간에서 비추는handle이다. 서로 다른 프로세스 공간에서 비추는handle은 다를 수 있지만 내부 핵 공간에서 그들은 같은 대상이다. 즉, 서로 다른 프로세스 공간의 다른handle을 통해 같은 내부 핵 대상을 조작하는 것이다.
mutex를 예로 들면,Create Mutex를 통해 이름이 있는 mutex의handle을 만들 수 있으며, 이전에 다른 프로그램이 만들지 않았다면, 시스템은 이mutex를 만들고handle을 되돌려줍니다.이전에 다른 프로그램이 만들어졌다면, 시스템은handle을 되돌려줍니다.handle에 대응하는 핵 대상은 지난번에 만들어진 것입니다.GetLastError()를 사용하여 error code를 가져오면 ERRORALREADY_EXISTS, 이 특성을 이용하여 많은 사람들이 이런 방법으로 하나의 실례만 실행하는 것을 제한한다.예를 들어 프로그램을 시작할 때 특별한 이름의 mutex를 만들어서 이전에 이 프로그램을 시작했는지 확인합니다. (Create Mutex 이후GetLast Error를 호출해서ERROR ALREADY EXISTS로 되돌아갈지 여부) 코드는 다음과 같습니다.
m_mutexHandle = CreateMutex(NULL, FALSE, _T("XXxxXX"));
if(m_mutexHandle==NULL)
{ 
	return FALSE;
}
if (GetLastError()   ==   ERROR_ALREADY_EXISTS)
{
	CloseHandle(m_mutexHandle);
	m_mutexHandle = NULL;
	CString szInfo;
	AfxMessageBox(_T("ALREADY_EXISTS"));
	return FALSE;
}

 
여기서는 과정 간의 상호 배척을 어떻게 실현하는지 지나치게 많은 토론을 하지 않는다.
1, mutex 만들기
HANDLE m_hMutex = CreateMutex(NULL, FALSE, L"RtsKeyStone_Mutex");

2, 이mutex를 이용하여 프로세스 동기화/함수 호출 접근
void Func()
{
	WaitForSingleObject(m_hMutex, INFINITE);
	// to do...
	ReleaseMutex(m_hMutex);
	return;
}

이렇게 하면 두 프로세스가func()에 동시에 접근할 수 없다는 것을 보장할 수 있다.
OK, 프로세스 간 동기화가 이루어졌지만 DLL의 글로벌 변수라면 어떻게 공유합니까?DLL에서 공유 세그먼트를 정의하는 것이 좋습니다.시험해 보니 이 방법은 확실히 효과를 볼 수 있다. #pragma data_seg 프리처리 명령은 공유 데이터 세그먼트를 설정하는 데 사용됩니다.
#progma data_set("SharedDataName")
int g_VendorPrevNum = 0; // need to init
#pragma data_seg()
#pragma comment(linker, "/Section:SharedDataName,RWS")

#pragma dataset("SharedDataName") 및 #pragma dataset () 사이의 모든 변수는 DLL에 액세스하는 모든 프로세스에서 보고 공유됩니다.
자세한 내용은 다음을 참조하십시오.http://blog.csdn.net/xuplus/article/details/2291860

좋은 웹페이지 즐겨찾기