일이 잘되는 것처럼 보이지만 이것이 최선의 방법인지 확신 할 수 없습니다.다른 스레드에서 벡터의 포인터 데이터를 수정하는 것이 안전합니까?
기본적으로 데이터의 비동기 검색을 수행하는 개체가 있습니다. 이 객체에는 주 스레드에서 할당되고 할당 해제 된 포인터 벡터가 있습니다. 부스트 함수를 사용하면 프로세스 결과 콜백이이 벡터의 포인터 중 하나와 바인딩됩니다. 실행되면 임의의 스레드에서 실행되고 포인터의 데이터가 수정됩니다.
이제 비동기 검색 개체가 더 많은 요청을받는 경우 벡터에서 지우고 지우는 부분 주위에 중요한 섹션이 있습니다. 그러나 포인터를 수정하는 콜백에서 어떤 종류의 가드가 필요한지 궁금합니다. 데이터도 마찬가지입니다. 그것을 이것은 ProccessResults 콜백에 대한 실제 코드 (플러스 이익을 위해 댓글)
void ProcessResults(CRetrieveResults* pRetrieveResults, CRetData* data)
{
// pRetrieveResults is delayed binding that server passes in when invoking callback in thread pool
// data is raw pointer to ref counted object in vector of main thread (the DataObject* in question)
// if there was an error set the code on the atomic int in object
data->m_nErrorCode.Store_Release(pRetrieveResults->GetErrorCode());
// generic iterator of results bindings for generic sotrage class item
TPackedDataIterator<GenItem::CBind> dataItr(&pRetrieveResults->m_DataIter);
// namespace function which will iterate results and initialize generic storage
GenericStorage::InitializeItems<GenItem>(&data->m_items, dataItr, pRetrieveResults->m_nTotalResultsFound); // this is potentially time consuming depending on the amount of results and amount of columns that were bound in storage class definition (i.e.about 8 seconds for a million equipment items in release)
// atomic uint32_t that is incremented when kicking off async retrieve
m_nStarted.Decrement(); // this one is done processing
// boost function completion callback bound to interface that requested results
data->m_complete(data->m_items);
}
당신이 현명한 대답을 원한다면 더 많은 정보를 추가해야합니다. 현재 중요한 것, 특히 SomeMethod와 IsComplete가 구현되고 어떻게 * complete * 플래그가 올라 갔는지, 그리고 무엇이 빠졌는가? 처리 함수의 마지막 줄이 할당이고, 그것이 사용자 정의 유형이 아니고 잠그지 않고'IsComplete'를 true로 설정하면, 대답은 '아니오'입니다. 안전하지 않습니다. 하지만 제 생각에 그 처리 기능은 단순한 해골에 지나지 않습니다. –
네, 이것은 골격입니다. 저는 그냥 메서드를 호출하고 그 안에 멤버를 할당한다는 것을 보여주고 싶었습니다. 이 시점에서 포인터 당 하나의 콜백 당 하나의 스레드 만 갖는 의미가 유지되는 한 괜찮을 것이라고 생각합니다. 점진적 비동기 검색은 너무 많은 대기 시간을 가져 오므로 아직 구현이 걱정되지 않습니다. – AJG85
본질적으로 접근 방법에는 문제가 없지만 악마는 세부 사항에 있습니다.실제 작업이 무엇이고 동기화가 * 공유 * 데이터에서 수행되는 방식에 따라 (내 생각에 공유 데이터는 IsComplete에 의해 검사 된 플래그 일뿐입니다) 올바른 것일 수 있습니다. 최선의 접근 방식이든 단순화 될 수 있는지는 전혀 다른 문제이지만, 맥락 없이는 말할 수 없습니다. 중요성이있는 것들 :'SmartPtr' 쓰레드를 안전하게 구현 하는가? 경쟁 조건에 대한 가능성이 높습니다. –