看的晕乎乎的~
解决方案 »
- occi 链接出错
- 弱问:关于spin 按键
- 请问如何实现高速串口通信
- TCHAR相加的问题
- 我有一块深圳东进公司的语音卡,谁要?可联系我,将以优惠价卖出.
- 利用winInet实现ftp client.目的是局域网外的主机A通过ftp client与网内主机C进行ftp交互
- 请大家给几个还支持pop方式收信的免费邮箱注册的地方(请版主不要删啊)
- 目前流行的unix系统有哪些?
- 老问题,至今没解决
- 请问MFC对序列化的支持,DECLARE_SERIAL和IMPLEMENT_SERIAL这两个宏没有声明 << 友元运算符
- _T怎样转换为L
- 像QQ哪样运行的时候,在桌面上显示主窗口,但是任务栏上却没有显示主窗口是怎么实现的。
我的理解:支持多个线程同时读;仅一个线程写。
写的时候怎么用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 )
互斥量:有两个比较重要的元素,线程ID, 计数器。
线程ID,表示当前是哪个线程拥有互斥,其它线程不能调用ReleaseMutex(handleMutex);来释放。
计数器,表示当前线程拥有多少次互斥量,如果调用了多次WaitForSingleObject(handleMutex, INFINITE);就要调用相应次数的ReleaseMutex(handleMutex); 直到计数器为0时才可算是释放了互斥量。
创建互斥量时,handleMutex = CreateMutex(NULL, false, NULL);
第2个参数为FALSE, 表示当前创建线程不拥有互斥量,如果为TRUE, 只有当前创建线程调用ReleaseMutex(handleMutex);后,线程函数才可以拥有互斥量。
互斥量理解~
我是不懂侯先生设计的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 )
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