用C语言运用信号量实现线程1往一个数组里面写一次,另一个线程读两次,然后线程1更改数据。线程2再度两次
时间: 2023-12-29 14:19:23 浏览: 85
c语言跨平台信号量封装
下面是一个用 C 语言实现的基于信号量的多线程程序,其中一个线程往一个数组里写入数据,另一个线程读取数据并进行操作。具体实现细节如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#define ARRAY_SIZE 10
int array[ARRAY_SIZE];
int write_index = 0;
int read_index = 0;
sem_t write_sem, read_sem;
// 线程1
void* write_array(void* arg) {
while(1) {
// 等待写信号量
sem_wait(&write_sem);
// 写入数据到数组
array[write_index] = write_index;
printf("write value: %d\n", array[write_index]);
write_index++;
// 释放读信号量
sem_post(&read_sem);
// 休眠1秒
sleep(1);
}
pthread_exit(NULL);
}
// 线程2
void* read_array(void* arg) {
while(1) {
// 等待读信号量
sem_wait(&read_sem);
// 读取数组中的数据并进行操作
for(int i = 0; i < 2; i++) {
printf("read value: %d\n", array[read_index]);
read_index++;
if(read_index == write_index) {
break;
}
}
// 释放写信号量
sem_post(&write_sem);
// 休眠1秒
sleep(1);
}
pthread_exit(NULL);
}
int main() {
pthread_t tid1, tid2;
// 初始化信号量
sem_init(&write_sem, 0, 1);
sem_init(&read_sem, 0, 0);
// 创建线程1和线程2
pthread_create(&tid1, NULL, write_array, NULL);
pthread_create(&tid2, NULL, read_array, NULL);
// 等待线程1和线程2结束
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
// 销毁信号量
sem_destroy(&write_sem);
sem_destroy(&read_sem);
return 0;
}
```
在上述代码中,我们使用了两个信号量来实现线程之间的同步和互斥。当线程1要向数组中写入数据时,它需要等待写信号量,表示当前数组空闲,可以写入数据;当线程2要从数组中读取数据时,它需要等待读信号量,表示当前数组中有可读数据。在写入和读取数据后,线程分别释放读信号量和写信号量。这样就保证了线程1和线程2之间的同步和互斥。
阅读全文