Linux实验一

#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;

}

相关推荐
知白守黑26712 分钟前
Linux磁盘阵列
linux·运维·服务器
维尔切1 小时前
Linux中基于Centos7使用lamp架构搭建个人论坛(wordpress)
linux·运维·架构
tan77º2 小时前
【项目】分布式Json-RPC框架 - 项目介绍与前置知识准备
linux·网络·分布式·网络协议·tcp/ip·rpc·json
正在努力的小河5 小时前
Linux设备树简介
linux·运维·服务器
荣光波比5 小时前
Linux(十一)——LVM磁盘配额整理
linux·运维·云计算
LLLLYYYRRRRRTT5 小时前
WordPress (LNMP 架构) 一键部署 Playbook
linux·架构·ansible·mariadb
轻松Ai享生活6 小时前
crash 进程分析流程图
linux
大路谈数字化7 小时前
Centos中内存CPU硬盘的查询
linux·运维·centos
luoqice8 小时前
linux下查看 UDP Server 端口的启用情况
linux
倔强的石头_9 小时前
【Linux指南】动静态库与链接机制:从原理到实践
linux