当前位置: 技术问答>linux和unix
求高手给点思路——信号量问题
来源: 互联网 发布时间:2016-09-01
本文导语: 题目: 假设你开了家租船公司,你公司有10艘游艇可以提供给客户。请编写程序来模拟船公司和客户。如果有大于10个客户同时想向船公司租船,那么必须等待。 我的思路: 先fork然后子进程作为客户端程序(客户)...
题目:
假设你开了家租船公司,你公司有10艘游艇可以提供给客户。请编写程序来模拟船公司和客户。如果有大于10个客户同时想向船公司租船,那么必须等待。
我的思路:
先fork然后子进程作为客户端程序(客户),父进程作为服务器程序(租船公司),但是具体不懂怎么写~请高手指点下~
假设你开了家租船公司,你公司有10艘游艇可以提供给客户。请编写程序来模拟船公司和客户。如果有大于10个客户同时想向船公司租船,那么必须等待。
我的思路:
先fork然后子进程作为客户端程序(客户),父进程作为服务器程序(租船公司),但是具体不懂怎么写~请高手指点下~
#include
#include
#include
#include
#include
int semid; //全局变量
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux specific) */
};
int sem_p(void);
int sem_v(void);
int sem_init(void);
void sem_del(void);
int main(int argc, char *argv[])
{
pid_t pid;
pid = fork();
if (pid == -1)
{
perror("fork");
exit(-1);
}
else if (pid == 0) //child process
{
}
else //parent process
{
}
return 0;
}
int sem_init(void) //信号量初始化
{
union semun sem;
sem.val = 10;
if (semctl(semid, 0, SETVAL, sem) == -1)
{
perror("semctl");
exit(-1);
}
return 0;
}
int sem_p(void) //P操作
{
num--;
struct sembuf sem;
sem.sem_num = 0;
sem.sem_op = -1;
sem.sem_flg = SEM_UNDO;
if (semop(semid, &sem, 1) == -1)
{
perror("semop p");
exit(-1);
}
printf("还有%d个n",num);
fflush(stdout);
return 0;
}
int sem_v(void) //V操作
{
num++;
struct sembuf sem;
sem.sem_num = 0;
sem.sem_op = +1;
sem.sem_flg = SEM_UNDO;
if (semop(semid, &sem, 1) == -1)
{
perror("semop v");
exit(-1);
}
return 0;
}
void sem_del(void) //删除信号
{
union semun semval;
if (semctl(semid, 0, IPC_RMID, semval) == -1)
{
perror("semdel");
exit(-1);
}
}
|
直接用POSIX信号量就行。
用多进程和多线程都可以,下面我用多线程写了一个,不知道是不是你想要的!
编译的时候别忘了加 -pthread
用多进程和多线程都可以,下面我用多线程写了一个,不知道是不是你想要的!
编译的时候别忘了加 -pthread
#include
#include
#include
#include
#include
#define NUM 20 //20个客户
sem_t sem;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int count = 0;
void * thread_routine(void *arg);
int main()
{
int i;
pthread_t tid;
sem_init(&sem, 0, 10);
for (i = 0; i