信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源.
互斥量用于线程的互斥,信号量用于线程的同步。信号量 只要信号量的value大于0,其他线程就可以sem_wait成功,成功后信号量的value减一。若value值不大于0,则sem_wait使得线程阻塞,直到sem_post释放后value值加一,但是sem_wait返回之前还是会将此value值减一
互 斥是二元信息灯,mutex被创建时可以有初始值,表示mutex被创建后,是锁定状态还是空闲状态。在同一个线程中,为了防止死锁,系统不允许连续两次 对Mutex加锁(系统一般会在第二次调用立刻返回)。也就是说,加锁和解锁这两个对应的操作,需要在同一个线程中完成。
不同操作系统中提供的mutex函数:
动作\系统 | Win32 | Linux | Solaris |
创建 | CreateMutex | pthread_mutex_init | mutex_init |
加锁 | WaitForSingleObject | pthread_mutex_lock | mutex_lock |
解锁 | ReleaseMutex | pthread_mutex_unlock | mutex_unlock |
销毁 | CloseHandle | pthread_mutex_destroy | mutex_destroy |
不同操作系统中的semaphore函数:
动作\系统 | Win32 | POSIX |
创建 | CreateSemaphore | sem_init |
等待 | WaitForSingleObject | sem _wait |
释放 | ReleaseMutex | sem _post |
试图等待 | WaitForSingleObject | sem _trywait |
销毁 | CloseHandle | sem_destroy |