看的晕乎乎的~

解决方案 »

  1.   

    这个reader锁设计就没看懂~~能给说下这段的意思吧。
    我的理解:支持多个线程同时读;仅一个线程写。
    写的时候怎么用Lock( DataSemaphore ),semaphore不是可以被其他线程释放吗
    读的时候用mutex,那其他线程也不能读了啊。mutex锁住之后,readercount+1还有意义吗
    为 Reader 锁定:
    Lock( ReaderMutex )
    ReadCount = ReaderCount + 1//这儿应该是ReaderCount。pdf上是ReadCount
    if (ReaderCount == 0)
    Unlock( DataSemaphore )
    Unlock( ReaderMutex )
    为 Reader 解除锁定:
    Lock( ReaderMutex )
    ReadCount = ReaderCount - 1//这儿同上
    if (ReaderCount == 0)
    Unlock( DataSemaphore )
    Unlock( ReaderMutex )
    为 Writer 锁定:
    Lock( DataSemaphore )
    为 Writer 解除锁定:
    UnLock( DataSemaphore )
      

  2.   

    你需要这样理解该内核对象:互斥量
    互斥量:有两个比较重要的元素,线程ID, 计数器。
    线程ID,表示当前是哪个线程拥有互斥,其它线程不能调用ReleaseMutex(handleMutex);来释放。
    计数器,表示当前线程拥有多少次互斥量,如果调用了多次WaitForSingleObject(handleMutex, INFINITE);就要调用相应次数的ReleaseMutex(handleMutex); 直到计数器为0时才可算是释放了互斥量。
    创建互斥量时,handleMutex = CreateMutex(NULL, false, NULL);
    第2个参数为FALSE, 表示当前创建线程不拥有互斥量,如果为TRUE, 只有当前创建线程调用ReleaseMutex(handleMutex);后,线程函数才可以拥有互斥量。
      

  3.   

    部长辛苦。这么晚了还在~
    互斥量理解~
    我是不懂侯先生设计的reader/writer锁。不懂这个锁的设计原理。win32第7章的。
    3L的这部分是从书上复制来的:
    为 Reader 锁定:
    Lock( ReaderMutex )
    ReadCount = ReaderCount + 1//这儿应该是ReaderCount。pdf上是ReadCount
    if (ReaderCount == 0)
    Unlock( DataSemaphore )
    Unlock( ReaderMutex )
    为 Reader 解除锁定:
    Lock( ReaderMutex )
    ReadCount = ReaderCount - 1//这儿同上
    if (ReaderCount == 0)
    Unlock( DataSemaphore )
    Unlock( ReaderMutex )
    为 Writer 锁定:
    Lock( DataSemaphore )
    为 Writer 解除锁定:
    UnLock( DataSemaphore )
      

  4.   

    刚刚翻了下书~~
    1.核心对象:handle和计数器
    2.当某个线程拥有mutex时,WaitForSingleObject() N次,也只需一次ReleaseMutex()。
    试验的代码:
    DWORD WINAPI ThreadFunc(LPVOID);
    DWORD WINAPI ThreadFunc1(LPVOID);
    HANDLE hMutex=NULL;
    char g_cArray[10];int main()
    {
    HANDLE hThrd,hThrd1;
    DWORD dwId; hMutex=CreateMutex(NULL,FALSE,"Sample Name");
    hThrd1=CreateThread(NULL,0,ThreadFunc1,(LPVOID)1,0,&dwId);
    Sleep(10);
    hThrd=CreateThread(NULL,0,ThreadFunc,(LPVOID)1,0,&dwId); Sleep(100);
    for(int i=0;i<10;i++)
    printf("%c",g_cArray[i]);
    CloseHandle(hMutex);
    return 0;
    }DWORD WINAPI ThreadFunc(LPVOID n)
    {
    WaitForSingleObject(hMutex,INFINITE);
    DWORD dw=GetLastError();
    if(dw==WAIT_ABANDONED_0)
    {
    printf("wrong\n");
    return -1;
    }
    for(int i=0;i<10;i++)
    {
    g_cArray[i]='b';
    Sleep(1);
    }
    ReleaseMutex(hMutex);
    return 0;
    }DWORD WINAPI ThreadFunc1(LPVOID n)
    {
    DWORD dw=WaitForSingleObject(hMutex,INFINITE);
    WaitForSingleObject(hMutex,INFINITE);
    for(int i=0;i<10;i++)
    {
    g_cArray[i]='a';
    Sleep(1);
    }
    WaitForSingleObject(hMutex,INFINITE);
    ReleaseMutex(hMutex);
    return 0;
    }输出bbbbbbbbbb
      

  5.   

    侯先生那本书讲解的似乎有问题,你可以看下重温经典系列windows核心编程中的线程读写锁,那个讲解的很不错。