互斥锁乎信号量有什么区别,请举例
时间: 2023-12-26 21:05:56 浏览: 28
互斥锁和信号量都是用来协调多个线程或进程之间的同步问题的机制。
互斥锁是一种简单的锁机制,它保证同一时间只有一个线程可以访问共享资源。当一个线程获得了互斥锁,其他线程就必须等待该线程释放锁后才能访问共享资源。互斥锁常用于保护共享资源的访问,例如文件、内存等。下面是一个互斥锁的简单示例:
```c
#include <pthread.h>
#include <stdio.h>
int count = 0;
pthread_mutex_t mutex;
void *increment(void *arg) {
pthread_mutex_lock(&mutex);
count++;
printf("Thread %d incremented count to %d\n", *((int *) arg), count);
pthread_mutex_unlock(&mutex);
}
int main() {
pthread_t threads[5];
int i, ids[5];
pthread_mutex_init(&mutex, NULL);
for (i = 0; i < 5; i++) {
ids[i] = i;
pthread_create(&threads[i], NULL, increment, &ids[i]);
}
for (i = 0; i < 5; i++) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&mutex);
return 0;
}
```
这个程序创建了5个线程,每个线程都会尝试增加count的值。使用互斥锁来保护count的访问,确保同一时间只有一个线程能够访问并修改count的值。
信号量是一种更加高级的同步机制,它可以用于控制访问共享资源的数量。信号量有一个计数器,该计数器的初始值由程序员指定。当一个线程需要访问共享资源时,它会尝试获取信号量,如果信号量的计数器大于0,则线程可以继续访问共享资源,并将信号量的计数器减1;否则线程必须等待其他线程释放信号量后才能访问共享资源。当一个线程完成共享资源的访问后,它会释放信号量,将信号量的计数器加1。下面是一个信号量的简单示例:
```c
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
int count = 0;
sem_t sem;
void *increment(void *arg) {
sem_wait(&sem);
count++;
printf("Thread %d incremented count to %d\n", *((int *) arg), count);
sem_post(&sem);
}
int main() {
pthread_t threads[5];
int i, ids[5];
sem_init(&sem, 0, 1);
for (i = 0; i < 5; i++) {
ids[i] = i;
pthread_create(&threads[i], NULL, increment, &ids[i]);
}
for (i = 0; i < 5; i++) {
pthread_join(threads[i], NULL);
}
sem_destroy(&sem);
return 0;
}
```
这个程序创建了5个线程,每个线程都会尝试增加count的值。使用信号量来控制同时访问count的线程数量,确保同一时间最多只有一个线程能够访问并修改count的值。在这个示例中,信号量的初始值为1,确保只有一个线程可以访问count的值。