用C语言运用信号量实现线程1往一个数组里面写一次,另一个线程读两次,然后线程1更改数据。线程2再读两次
时间: 2023-12-29 19:19:27 浏览: 93
c语言跨平台信号量封装
下面是用C语言运用信号量实现线程1往一个数组里面写一次,另一个线程读两次,然后线程1更改数据,线程2再读两次的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define N 10
int array[N];
sem_t sem_read, sem_write;
void *writer(void *arg) {
int i;
for (i = 0; i < N; i++) {
sem_wait(&sem_write); // 等待写信号量
array[i] = i + 1;
printf("Writer: write %d to array[%d]\n", i+1, i);
sem_post(&sem_read); // 发送读信号量
}
pthread_exit(NULL);
}
void *reader(void *arg) {
int i;
for (i = 0; i < N; i++) {
sem_wait(&sem_read); // 等待读信号量
printf("Reader: read %d from array[%d]\n", array[i], i);
sem_wait(&sem_read); // 再次等待读信号量
printf("Reader: read %d from array[%d]\n", array[i], i);
sem_post(&sem_write); // 发送写信号量
}
pthread_exit(NULL);
}
int main() {
pthread_t writer_thread, reader_thread;
sem_init(&sem_read, 0, 0);
sem_init(&sem_write, 0, 1);
// 创建写线程
if (pthread_create(&writer_thread, NULL, writer, NULL) != 0) {
perror("pthread_create");
exit(EXIT_FAILURE);
}
// 创建读线程
if (pthread_create(&reader_thread, NULL, reader, NULL) != 0) {
perror("pthread_create");
exit(EXIT_FAILURE);
}
// 等待线程结束
if (pthread_join(writer_thread, NULL) != 0) {
perror("pthread_join");
exit(EXIT_FAILURE);
}
if (pthread_join(reader_thread, NULL) != 0) {
perror("pthread_join");
exit(EXIT_FAILURE);
}
sem_destroy(&sem_read);
sem_destroy(&sem_write);
return 0;
}
```
在上面的代码中,我们使用了两个信号量(`sem_read`和`sem_write`)来控制线程之间的同步。线程1在写入数组元素之前会等待写信号量,线程2在读取数组元素之前会等待读信号量,这样可以确保线程1和线程2之间的操作不会发生竞争。当线程1写入数组元素后,会发送读信号量,让线程2来读取数组元素。线程2在读取完数组元素后,也会等待读信号量,等待线程1更改数组元素。当线程1更改数组元素后,又会发送写信号量,让线程2继续读取数组元素。这样,线程1和线程2之间就可以协调地进行读写操作。
需要注意的是,在实际使用中,还需要考虑线程之间的互斥问题,以避免多个线程同时访问共享资源而导致数据不一致的问题。可以使用线程锁等机制来实现线程之间的互斥。
阅读全文