主函数创建两个线程,用两个信号量(读信号量和写信号量)实现两个线程对全局变量 char buf[100]的同步访问。其中线程1写缓冲区buf,线程2读缓冲区buf。主线程调用pthread_join()函数等待两个线程的结束,然后注销信号量,结束进程。 注意:两个信号量的初始化问题
时间: 2024-03-21 07:39:37 浏览: 72
好的,我明白你的问题了。在这个场景中,我们需要使用两个信号量来控制两个线程对全局变量 `char buf[100]` 的访问。其中一个信号量用于控制读访问,另一个信号量用于控制写访问。
以下是示例代码,供你参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUF_SIZE 100
char buf[BUF_SIZE];
sem_t read_sem, write_sem;
void *write_thread(void *arg)
{
int i;
for (i = 0; i < BUF_SIZE; i++) {
sem_wait(&write_sem);
buf[i] = 'A' + i % 26;
sem_post(&read_sem);
}
pthread_exit(NULL);
}
void *read_thread(void *arg)
{
int i;
for (i = 0; i < BUF_SIZE; i++) {
sem_wait(&read_sem);
printf("%c", buf[i]);
sem_post(&write_sem);
}
printf("\n");
pthread_exit(NULL);
}
int main()
{
pthread_t tid_write, tid_read;
int ret;
// 初始化信号量
ret = sem_init(&read_sem, 0, 0);
if (ret != 0) {
perror("sem_init");
exit(EXIT_FAILURE);
}
ret = sem_init(&write_sem, 0, 1);
if (ret != 0) {
perror("sem_init");
exit(EXIT_FAILURE);
}
// 创建线程
ret = pthread_create(&tid_write, NULL, write_thread, NULL);
if (ret != 0) {
perror("pthread_create");
exit(EXIT_FAILURE);
}
ret = pthread_create(&tid_read, NULL, read_thread, NULL);
if (ret != 0) {
perror("pthread_create");
exit(EXIT_FAILURE);
}
// 等待线程结束
ret = pthread_join(tid_write, NULL);
if (ret != 0) {
perror("pthread_join");
exit(EXIT_FAILURE);
}
ret = pthread_join(tid_read, NULL);
if (ret != 0) {
perror("pthread_join");
exit(EXIT_FAILURE);
}
// 注销信号量
sem_destroy(&read_sem);
sem_destroy(&write_sem);
return 0;
}
```
在这个示例中,我们使用了 `sem_t` 类型的变量来表示信号量。`sem_init()` 函数用于初始化信号量,其中第二个参数表示信号量的进程间共享属性,第三个参数表示信号量的初始值。
在主函数中,我们首先初始化了两个信号量,然后创建了两个线程分别用于写入和读取缓冲区。线程函数中,我们使用 `sem_wait()` 函数来等待信号量的值变为非零,表示可以执行相应的操作。执行完相应的操作后,我们使用 `sem_post()` 函数来增加信号量的值,表示可以让另一个线程执行相应的操作。
最后,在主函数中,我们使用 `pthread_join()` 函数等待两个线程的结束,然后使用 `sem_destroy()` 函数注销信号量。
阅读全文