2010-06-02 3 views
1
else if (!registryData.ContainsKey(keyName)) 
{ 
    keyInvolved = new RegistryKy(keyName); 
    lock (registryDataLock) 
    { 
     registryData.Add(keyName, keyInvolved); 
    } 
    processInvolved = new Proces(procInvolved); 
    keyInvolved.addProcessToDict(processInvolved); 
} 

keyName은 레지스트리 키를 나타내는 문자열입니다. keyInvolved는 실제 레지스트리 키 객체입니다.사전/해시 맵 ......... 지구상에서 무슨 일이 일어나고 있습니까?

나는 이미 존재하는 키를 추가했다는 말을 듣지 만 아직 이미 있는지 여부를 확인했습니다. ???

+0

사용중인 언어를 추가 할 수 있습니까? –

+0

실제로 RegistryKy를 어떻게 정의 할 수 있습니까? 나는 아래 답변했다. 그러나 나는 정말로 RegistryKy 정의를보아야한다! – VoodooChild

답변

2

이것은 어두운 곳에서 찌르는 것이지만 에 registryDataLock이 있다는 것은 나에게 이것이 멀티 스레드임을 말해줍니다. 다른 스레드가 ContainsKey을 호출 한 후 Add을 호출하기 전에 사전에 키를 추가 할 수 있습니까?

는 또한, 유사 이름의 변수는

-1

이 이렇게해야 ... 읽기이 코드가 아니라 하드합니다

else if (!registryData.ContainsKey(kyInvolved)) 
{ 
    //keyInvolved = new RegistryKy(kyInvolved); 
    lock (registryDataLock) 
    { 
     //registryData.Add(kyInvolved, keyInvolved); 
     registryData.Add(kyInvolved, new RegistryKy(kyInvolved)); 
    } 
    processInvolved = new Proces(procInvolved); 
    keyInvolved.addProcessToDict(processInvolved); 
} 
+0

잠금이 실제로 ContainsKey 검사보다 앞에 있어야합니다. –

+0

잘못되었습니다. 다른 실이 자물쇠 오른쪽에 올 수 있고 당신은 여전히 ​​망했다. –

1

같은 lock 블록 내에서 ContainsKeyAdd를 호출해야 그렇지 않으면 다른 스레드가 ContainsKey에 전화를 걸고 잠금을 획득 한 시간 사이에 키를 추가 할 수 있습니다. 한 가지 방법이 있습니다.

// check to see if the key exists 
else if (!registryData.ContainsKey(keyName)) 
{ 
    bool foundKey; 
    // lock the dictionary 
    lock (registryDataLock) 
    { 
     // make sure another thread didn't add the key while waiting on the lock 
     if (!(foundKey = registryData.ContainsKey(keyName))) 
     { 
      keyInvolved = new RegistryKy(keyName); 
      registryData.Add(keyName, keyInvolved); 
     } 
     // release the lock as soon as we're done with registryData 
    } 
    // now perform operations that need to be done when we've added 
    // a key but without holding the registry lock 
    if (!foundKey) 
    { 
     processInvolved = new Proces(procInvolved); 
     keyInvolved.addProcessToDict(processInvolved); 
    } 
} 
관련 문제