프로세스 간 동기화(상호 배척) 및 동일한 DLL의 다른 프로세스 copy 공유 글로벌 변수
그래, 서로 밀어붙이면 돼. 간단하게, 일반적인 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
언제가 아닌가프로그래밍 언어에서 null 참조가 수십억 달러의 실수라는 말을 이미 들었을 것입니다. Java의 유명하고 두려운 NullPointerException은 여러분이 알고 있거나 C의 분할 오류일 수 있습니다. 모든 상...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.