WEB开发网
开发学院软件开发VC VC++线程同步解析 阅读

VC++线程同步解析

 2012-08-10 14:21:29 来源:WEB开发网   
核心提示:LONG lInitialCount, // 初始计数LONG lMaximumCount, // 最大计数LPCTSTR lpName // 对象名指针);参数lMaximumCount 是一个有符号32 位值,定义了允许的最大资源计数,VC++线程同步解析(6),最大取值不能超过4294967295,lpName
LONG lInitialCount, // 初始计数
LONG lMaximumCount, // 最大计数
LPCTSTR lpName // 对象名指针
);
参数lMaximumCount 是一个有符号32 位值,定义了允许的最大资源计数,最大取值不
能超过4294967295。lpName 参数可以为创建的信号量定义一个名字,由于其创建的是一个
内核对象,因此在其他进程中可以通过该名字而得到此信号量。OpenSemaphore()函数即
可用来根据信号量名打开在其他进程中创建的信号量,函数原型如下:
HANDLE OpenSemaphore(
DWORD dwDesiredAccess, // 访问标志
BOOL bInheritHandle, // 继承标志
LPCTSTR lpName // 信号量名
);
在线程离开对共享资源的处理时,必须通过ReleaseSemaphore()来增加当前可用资源
计数。否则将会出现当前正在处理共享资源的实际线程数并没有达到要限制的数值,而其他线程
却因为当前可用资源计数为0 而仍无法进入的情况。ReleaseSemaphore()的函数原型为:
BOOL ReleaseSemaphore(
HANDLE hSemaphore, // 信号量句柄
LONG lReleaseCount, // 计数递增数量
LPLONG lpPreviousCount // 先前计数
);
该函数将lReleaseCount 中的值添加给信号量的当前资源计数,一般将lReleaseCount
设置为1,如果需要也可以设置其他的值。WaitForSingleObject()和
WaitForMultipleObjects()主要用在试图进入共享资源的线程函数入口处,主要用来判断信
号量的当前可用资源计数是否允许本线程的进入。只有在当前可用资源计数值大于0 时,被监
视的信号量内核对象才会得到通知。
信号量的使用特点使其更适用于对Socket(套接字)程序中线程的同步。例如,网络上的
HTTP 服务器要对同一时间内访问同一页面的用户数加以限制,这时可以为没一个用户对服务器
的页面请求设置一个线程,而页面则是待保护的共享资源,通过使用信号量对线程的同步作用可
以确保在任一时刻无论有多少用户对某一页面进行访问,只有不大于设定的最大用户数目的线程
能够进行访问,而其他的访问企图则被挂起,只有在有用户退出对此页面的访问后才有可能进入。
下面给出的示例代码即展示了类似的处理过程:
// 信号量对象句柄
HANDLE hSemaphore;
UINT ThreadProc15(LPVOID pParam)
{
// 试图进入信号量关口
WaitForSingleObject(hSemaphore, INFINITE);
// 线程任务处理
AfxMessageBox("线程一正在执行!");
// 释放信号量计数
ReleaseSemaphore(hSemaphore, 1, NULL);
return 0;
}
UINT ThreadProc16(LPVOID pParam)
{
// 试图进入信号量关口
WaitForSingleObject(hSemaphore, INFINITE);
// 线程任务处理
AfxMessageBox("线程二正在执行!");
// 释放信号量计数
ReleaseSemaphore(hSemaphore, 1, NULL);
return 0;
}
UINT ThreadProc17(LPVOID pParam)
{
// 试图进入信号量关口
WaitForSingleObject(hSemaphore, INFINITE);
// 线程任务处理
AfxMessageBox("线程三正在执行!");
// 释放信号量计数
ReleaseSemaphore(hSemaphore, 1, NULL);
return 0;
}
……
void CSample08View::OnSemaphore()
{
// 创建信号量对象
hSemaphore = CreateSemaphore(NULL, 2, 2, NULL);
// 开启线程
AfxBeginThread(ThreadProc15, NULL);
AfxBeginThread(ThreadProc16, NULL);
AfxBeginThread(ThreadProc17, NULL);
}

上述代码在开启线程前首先创建了一个初始计数和最大资源计数均为2 的信号量对象hSemaphore。即在同一时刻只允许2 个线程进入由hSemaphore 保护的共享资源。随后开启的三个线程均试图访问此共享资源,在前两个线程试图访问共享资源时,由于hSemaphore的当前可用资源计数分别为2 和1,此时的hSemaphore 是可以得到通知的,也就是说位于线程入口处的WaitForSingleObject()将立即返回,而在前两个线程进入到保护区域后,hSemaphore 的当前资源计数减少到0,hSemaphore 将不再得到通知,WaitForSingleObject()将线程挂起。直到此前进入到保护区的线程退出后才能得以进入。

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:VC 线程 同步

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接