前言
Hello,我是修齊。
学习C++的第一百零二十五天,用心学习。
在这里记录一些学习的东西和学习的心情,内容主要是一些自己学习整理的小笔记。
一、临界区
1.临界区的意思是一段关键代码,执行代码相当于进入临界区。
2.执行临界区代码,要独占临界区对象。
3.操作临界区对象的函数:
InitialzeCriticalSetion函数,初始化一个临界区对象,声明:
void
InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
4.lpCriticalSection为指向一个临界区对象的指针。
5.CRITICAL_SECTION是一个结构体,定义了和线程访问相关的控制信息。
6.EnterCriticalSection用于等待临界区对象的所有权,获得临界区对象,该函数返回,否则函数进入阻塞,线程进入睡眠状态。函数声明:
void
EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
7.TryEnterCriticalSection用于等待临界区对象的所有权,和EnterCriticalSection不同,TryEnterCriticalSection不管有没有获取到临界区对象所有权,都 立即返回,相当于一个异步函数,声明:
BOOL
TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
8.LeaveCriticalSection用于释放临界区对象的所有 权,声明:
void
LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
9.DeleteCriticalSection用于删除临界区对象,释放相关资源,声明:
void
DeleteCtricalSection(LPCRITICAL_SECTION lpCriticalSection);
二、互斥对象
1.互斥对象(互斥量Mutex),属于系统内核对象。
2.只有拥有互斥对象的线程才具有访问资源的权限。
3.使用互斥对象通常需要结合等待函数WaitForSingleObject。
4.当没有线程拥有互斥对象时,系统会为互斥对象设置有信号装填,相当于向外发送信号。
5.WaitForMultipleObjects、WaitForSingleObject用来等待某个对象的信号,直到对象有信号或等待超时才返回,WaitForSingleObject声明:
DWORD WaitForSingleObject(HANDLE hHandle,DWOD dwMilliseconds);
6.dwMilliseconds表示等待超时的时间,单位是毫秒,若参数是0,函数测试对象信号状态后立即返回,若参数是宏INFINITE,表示函数不设超时时间一直等待对象有信号为止。
7.函数成功,返回值:
WAIT_ABANDONED:表示指定的对象是互斥对象,拥有的该对象线程未释放时,互斥对象的所有权被赋予调用本函数的线程,同时互斥对象被设为无信号状态。
WAIT_OBJECT_0:表示指定的对象处于有信号状态。
WAIT_TIMEOUT:表示等待超时,同时对象处于无信号状态。
8.函数失败,返回WAIT_FALLED((DWORD)0 x FFFFFFFF),相当于-1.
9.WaitForMultipleObjects可以用来等待多个对象,数目不能超64。
10.CreateMutex创建或打开一个互斥对象,声明:
HANDLE
CreateMutex(LPSECURITY_ATTRIBUTES
lpMutexAttributes,
BOOL bInitialOwner,LPCTSTR lpName);
11.lpMutexAttributes为指向PSECURITY_ATTRIBUTES结构的指针,该结构表示互斥的安全属性,主要决定函数返回的互斥对象句柄能否被子进程继承。
12.若参数为NULL,函数返回的句柄不能被子进程继承。
13.blnitialOwner决定调用该函数创建互斥对象的线程是否拥有该互斥对象的所有权,该参数为TRUE,表示创建该互斥对象的线程拥有该互斥对象的所有权。
14.IpName是一个字符串指针,用于确定互斥对象的名称,名称区分大小写,长度不能超过MAX_PATH,若参数为NULL,则不给互斥对象起名,起名在于不同进程之间线程同步。
15.ReleaseMutex释放互斥对象的所有权,声明:
BOOL ReleaseMutex(HANDLE
hMutex);
16.hMutex是互斥对象的句柄,函数成功返回非零,否则返回零。
17.ReleaseMutex用来释放互斥对象所有权,并不销毁互斥对象,当进程结束,系统自动关闭互斥对象句柄,可以使用CloseHandle函数来关闭互斥对象句柄,当最后一个句柄被关闭的时间系统销毁互斥 对象。
三、事件对象
1.事件对象属于系统内核对象。
2.等待的事件对象有信号状态时,等待事件对象的线程 得以恢复,继续执行,若等待的事件对象处于无信号状态,则等待该对象的线程挂起。
3.事件:手动事件+自动事件。
4.CreateEvent用于创建或打开一个事件对象,声明:
HANDLE
CreateEvent(LPSECURITY_ATTRIBULES lpEventAttributes,
BOOL
bManualReset,BOOL bInitialState,LPCTSTR lpName);
5.bManualReset用于确定是创建一个手动事件还是一个自动事件。
6.bInitialState用于指定事件对象的初始状态,为TRUE表示事件对象创建后处于有信号状态,否则无信号状态。
7.IpName指向一个字符串,表示事件对象的名称。
8.SetEvent将事件对象设为有信号状态,
BOOL SetEvent(HANDLE hEvent);
9.ResetEvent将事件对象重置为无信号状态,声明:
BOOL ResetEvent(HANDLE hEvent);
四、信号量对象
1.属于内核对象,工作原理:信号量内部有计数器,计数大于零,信号量对象有信号,线程得以继续进行,同时,信号量对象的计数器减一;计数器为零,信号量对象处于无信号,等待信号量对象的线程阻塞。
2.CreateSemaphore创建或打开一个信号量对象,声明:
HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES
lpSemaphoreAttributes,
LONG lInitialCount,LONG lMaximumCount,LPCTSTR lpName);
3.lInitialCount表示信号量的初始计数,参数必须大于等于零,并小于等于lMaximumCount.
4.lMaximumCount指定信号量对象计数器的最大值,参数大于零。
5.lpName指向一个字符串,指定信号量对象的名称。
6.ReleaseSemaphore用来为信号量对象的计数器增加一定数量,声明:
BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,
LPLONG
lpPreviousCount);
7.lReleaseCount指定要将信号量对象的当前计数器增加的数目,参数必须大于零。参数使得计数器的值大于其最大值(创建信号量对象的时候设定),计数器值将保持不变,函数返回:FALSE.
8.lpPreviousCount指定一个变量,存储信号量对象计数器的前一个值,函数成功,返回非零,否则返回零。
五、小脑袋,大疑问
宿舍来人,卫生有点脏,味道有点重,最近考虑要不搬出去,过两天发工资,,,向前向前永远向钱。。。
上述内容如有侵权,联系即删。
感谢阅读-感谢支持