首页 理论教育 Windows事件创建/打开方法

Windows事件创建/打开方法

时间:2023-11-17 理论教育 版权反馈
【摘要】:4.1.4.2事件创建/打开事件在Windows中,使用函数CreateEvent来创建一个指定名称或无名的事件对象,函数中的参数用来指定函数执行后返回的句柄是否具有被继承的属性,以及设置事件对象的初始状态为有信号状态。

Windows事件创建/打开方法

4.1.4.1 互斥

(1)创建互斥

函数CreateMutex用于创建一个指定名称或无名的互斥对象,可以指定当前进程中的线程为该互斥对象的初始拥有者。函数返回一个互斥句柄,当前进程中的线程都可以使用它。

Linux中通过pthread 库调用函数pthread_mutex_init来创建互斥。

(2)锁定互斥

在Windows中,函数WaitForSingleObject用于阻塞当前进程内对资源的独占访问的请求。该方法在资源还没有被锁定的时候,锁定资源;若资源已被锁定,则该方法会阻塞调用资源的线程,一直到资源被解除锁定。同样的功能,在Linux,对应函数pthread_mutex_lock。

(3)释放互斥

函数ReleaseMutex用来释放指定的互斥对象以释放对资源的独占访问。Linux中使用函数pthread_mutex_unlock 同样可以释放互斥。

(4)销毁互斥

在前文中,介绍了函数CloseHandle是用来向操作系统声明结束对对象句柄的访问。这里,可以调用该函数来关闭函数CreateMutex所创建的句柄,以销毁互斥对象。在Linux中,函数pthread_mutex_destroy同样也用于销毁互斥对象,释放它可能持有的资源。

4.1.4.2 事件

(1)创建/打开事件

在Windows中,使用函数CreateEvent来创建一个指定名称或无名的事件对象,函数中的参数用来指定函数执行后返回的句柄是否具有被继承的属性,以及设置事件对象的初始状态为有信号状态。函数OpenEvent用来打开一个指定名称的事件对象,返回该事件对象的句柄。

在Linux中,POSIX信号量虽然是计数器信号量,但是当该计数器被设置为1时,可以提供与Windows事件对象相类似的功能,且同样提供初始状态。因此可以调用函数sem_init来创建一个POSIX信号量,通过函数中的参数值来设置该信号量的初始状态。

另外,在Linux中,还可以使用函数pthread_cond_init来创建一个条件变量,然后使用函数pthread_condattr_init对与该条件变量关联在一起的属性进行初始化,最后使用函数pthread_condattr_destroy来销毁属性。条件变量在初始化时,可以通过函数pthread_condattr_setpshared 来指定该条件变量是用于进程内的线程间同步,还是用于进程间同步。

在Linux中,函数semget可以用来打开某个信号量,实现与函数OpenEvent同样的功能。

(2)等待事件(www.xing528.com)

事件对象操作中,同样可以使用函数WaitForSingleObject来阻塞线程/进程。在Linux中,POSIX信号量使用函数sem_wait(或sem_trywait)来挂起调用线程,直到信号量的计数器变成非零的值为止。还可以使用phread_cond_wait(或phread_cond_timedwait)函数来阻塞线程。

(3)设置事件状态

函数SetEvent用来将事件对象的状态设置为有信号状态。在Linux中,可以调用函数sem_post来发出一个POSIX信号量来唤醒在该信号量上阻塞的所有线程,也可以调用pthread_cond_signal函数来唤醒在某个条件变量上等待的一个线程。

(4)销毁事件对象

在Windows中,同样使用函数CloseHandle来销毁事件对象,在Linux中,则可以通过调用函数sem_destroy或pthread_cond_destroy来销毁信号量对象或条件变量,以释放它们所持有的资源。

4.1.4.3 信号量

(1)创建信号量

在Windows中,信号量是一些计数器变量,用来允许有限个线程/进程访问共享资源,使用函数CreateSemaphore可以创建一个指定名称或无名的信号量,有名称的信号量用于进程之间的同步,无名的信号量则用于线程之间的同步。函数中的参数指定了信号量的初始值,执行后返回信号量的句柄。

在Linux中,System V信号量可用于进程之间的同步,而POSIX信号量则用于相同进程的不同线程之间,它们分别对应于Windows中的指定名称和无名的信号量。对于System V信号量,可以由函数semget来创建,而POSIX信号量的创建,则由函数sem_init来实现。

(2)获取信号量

在Windows中,等待函数提供了获取同步对象的机制,因此函数WaitForSingleObject又可以被用来获取信号量,具体来说,该函数使用一个信号量对象的句柄作为参数,在该信号量的状态没有变为有信号状态之前,会一直等待下去,直到超时为止。在Linux中,对于POSIX信号量,可以使用sem_wait(或sem_trywait)函数来获取对信号量的访问,该函数会挂起调用线程,直到信号量有一个非空计数为止;对于System V信号量,需要使用函数semop 来获取信号量,该函数会执行操作集中指定的操作,并阻塞调用进程/线程,直到信号量为0 或者更大为止。

(3)释放信号量

函数ReleaseSemaphore用来释放信号量。在Linux中,对于POSIX信号量,使用sem_post来释放信号量;对于System V信号量而言,则是调用函数semop 来释放信号量。

(4)销毁信号量

在Windows中,函数CloseHandle也可以用来销毁信号量,在Linux中,对于POSIX信号量,函数sem_destroy负责销毁信号量,以释放它所持有的资源。而对于System V信号量来说,则需要调用函数semctl中的IPC_RMID命令来实现同样的功能。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈