#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
int g_var=100;
int main()
{
int var=100;
int pid=fork();
if(pid==0)
{
while(1)
{
g_var++;
var++;
printf("%d %d %d %d\n",g_var,var,getppid(),getpid());
if(g_var>1000||var>1000) break;
sleep(1);
}
}
else
{
sleep(1);
printf("%d %d %d %d\n",g_var,var,getppid(),getpid());
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
// 声明一个 POSIX 信号量
sem_t semaphore;
// 共享资源
int shared_resource = 0;
// 线程函数
void *thread_function(void *arg) {
int i;
for (i = 0; i < 5; i++) {
// 等待信号量
sem_wait(&semaphore);
// 临界区,访问共享资源
shared_resource++;
printf("Thread: shared_resource = %d\n", shared_resource);
// 释放信号量
sem_post(&semaphore);
}
pthread_exit(NULL);
}
int main() {
// 初始化信号量
if (sem_init(&semaphore, 0, 1) != 0) {
perror("Semaphore initialization failed");
exit(EXIT_FAILURE);
}
pthread_t thread;
// 创建线程
if (pthread_create(&thread, NULL, thread_function, NULL) != 0) {
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
// 等待线程结束
pthread_join(thread, NULL);
// 销毁信号量
sem_destroy(&semaphore);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#define NUM_PHILOSOPHERS 5
sem_t forks[NUM_PHILOSOPHERS];
void *philosopher(void *arg) {
int id = *(int *)arg;
int left_fork = id;
int right_fork = (id + 1) % NUM_PHILOSOPHERS;
while (1) {
// 思考
printf("Philosopher %d is thinking\n", id);
sleep(rand() % 3);
// 拿起左边的叉子
sem_wait(&forks[left_fork]);
printf("Philosopher %d picked up fork %d (left)\n", id, left_fork);
// 拿起右边的叉子
sem_wait(&forks[right_fork]);
printf("Philosopher %d picked up fork %d (right)\n", id, right_fork);
// 吃饭
printf("Philosopher %d is eating\n", id);
sleep(rand() % 3);
// 放下左边的叉子
sem_post(&forks[left_fork]);
printf("Philosopher %d put down fork %d (left)\n", id, left_fork);
// 放下右边的叉子
sem_post(&forks[right_fork]);
printf("Philosopher %d put down fork %d (right)\n", id, right_fork);
}
}
int main() {
pthread_t philosophers[NUM_PHILOSOPHERS];
int ids[NUM_PHILOSOPHERS];
// 初始化叉子的信号量
for (int i = 0; i < NUM_PHILOSOPHERS; ++i) {
sem_init(&forks[i], 0, 1);
}
// 创建哲学家线程
for (int i = 0; i < NUM_PHILOSOPHERS; ++i) {
ids[i] = i;
pthread_create(&philosophers[i], NULL, philosopher, &ids[i]);
}
// 等待线程结束
for (int i = 0; i < NUM_PHILOSOPHERS; ++i) {
pthread_join(philosophers[i], NULL);
}
// 销毁叉子的信号量
for (int i = 0; i < NUM_PHILOSOPHERS; ++i) {
sem_destroy(&forks[i]);
}
return 0;
}