进程同步c语言
① 在linux下用c语言实现用多进程同步方法演示“生产者-消费者”问题
这个问题需要的知识主要包括:
1 多进程间进行通信;
2 使用同步信号量(semaphore)和互斥信号量(mutex)进行数据保护。
参考代码如下,可以参照注释辅助理解:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<semaphore.h>
#defineN2//消费者或者生产者的数目
#defineM10//缓冲数目
intin=0;//生产者放置产品的位置
intout=0;//消费者取产品的位置
intbuff[M]={0};//缓冲初始化为0,开始时没有产品
sem_tempty_sem;//同步信号量,当满了时阻止生产者放产品
sem_tfull_sem;//同步信号量,当没产品时阻止消费者消费
pthread_mutex_tmutex;//互斥信号量,一次只有一个线程访问缓冲
intproct_id=0;//生产者id
intprochase_id=0;//消费者id
/*打印缓冲情况*/
voidprint()
{
inti;
for(i=0;i<M;i++)
printf("%d",buff[i]);
printf(" ");
}
/*生产者方法*/
void*proct()
{
intid=++proct_id;
while(1)
{
//用sleep的数量可以调节生产和消费的速度,便于观察
sleep(1);
//sleep(1);
sem_wait(&empty_sem);
pthread_mutex_lock(&mutex);
in=in%M;
printf("proct%din%d.like: ",id,in);
buff[in]=1;
print();
++in;
pthread_mutex_unlock(&mutex);
sem_post(&full_sem);
}
}
/*消费者方法*/
void*prochase()
{
intid=++prochase_id;
while(1)
{
//用sleep的数量可以调节生产和消费的速度,便于观察
sleep(1);
//sleep(1);
sem_wait(&full_sem);
pthread_mutex_lock(&mutex);
out=out%M;
printf("prochase%din%d.like: ",id,out);
buff[out]=0;
print();
++out;
pthread_mutex_unlock(&mutex);
sem_post(&empty_sem);
}
}
intmain()
{
pthread_tid1[N];
pthread_tid2[N];
inti;
intret[N];
//初始化同步信号量
intini1=sem_init(&empty_sem,0,M);
intini2=sem_init(&full_sem,0,0);
if(ini1&&ini2!=0)
{
printf("seminitfailed ");
exit(1);
}
//初始化互斥信号量
intini3=pthread_mutex_init(&mutex,NULL);
if(ini3!=0)
{
printf("mutexinitfailed ");
exit(1);
}
//创建N个生产者线程
for(i=0;i<N;i++)
{
ret[i]=pthread_create(&id1[i],NULL,proct,(void*)(&i));
if(ret[i]!=0)
{
printf("proct%dcreationfailed ",i);
exit(1);
}
}
//创建N个消费者线程
for(i=0;i<N;i++)
{
ret[i]=pthread_create(&id2[i],NULL,prochase,NULL);
if(ret[i]!=0)
{
printf("prochase%dcreationfailed ",i);
exit(1);
}
}
//销毁线程
for(i=0;i<N;i++)
{
pthread_join(id1[i],NULL);
pthread_join(id2[i],NULL);
}
exit(0);
}
在Linux下编译的时候,要在编译命令中加入选项-lpthread以包含多线程支持。比如存储的C文件为demo.c,要生成的可执行文件为demo。可以使用命令:
gcc demo.c -o demo -lpthread
程序中为便于观察,使用了sleep(1);来暂停运行,所以查看输出的时候可以看到,输出是每秒打印一次的。
② 求用c语言实现消费者和生产者的问题,简单点,就用一个生产者和一个消费者的两进程同步算法,谢谢啦各位
#include<stdio.h>
#include<stdlib.h>
int mutex=1,full=0,empty=3,x=0;
int main()
{
int n;
void procer();
void consumer();
int wait(int);
int signal(int);
printf("\n1.Procer\n2.Consumer\n3.Exit");
while(1)
{
printf("\nEnter your choice:");
scanf("%d",&n);
switch(n)
{
case 1: if((mutex==1)&&(empty!=0))
procer();
else
printf("Buffer is full!!");
break;
case 2: if((mutex==1)&&(full!=0))
consumer();
else
printf("Buffer is empty!!");
break;
case 3:
exit(0);
break;
}
}
return 0;
}
int wait(int s)
{
return (--s);
}
int signal(int s)
{
return(++s);
}
void procer()
{
mutex=wait(mutex);
full=signal(full);
empty=wait(empty);
x++;
printf("\nProcer proces the item %d",x);
mutex=signal(mutex);
}
void consumer()
{
mutex=wait(mutex);
full=wait(full);
empty=signal(empty);
printf("\nConsumer consumes item %d",x);
x--;
mutex=signal(mutex);
}
③ C语言如何在线程间实现同步和互斥
线程之间的同步和互斥解决的问题是线程对共同资源进行访问。Posix有两种方式:
信号量和互斥锁;信号量适用同时可用的资源为多个的情况;互斥锁适用于线程可用的资源只有一个的情况
1、互斥锁:互斥锁是用加锁的方式来控制对公共资源的原子操作(一旦开始进行就不会被打断的操作)
互斥锁只有上锁和解锁两种状态。互斥锁可以看作是特殊意义的全局变量,因为在同一时刻只有一个线程能够对互斥锁进行操作;只有上锁的进程才可以对公共资源进行访问,其他进程只能等到该进程解锁才可以对公共资源进行操作。
互斥锁操作函数:
pthread_mutex_init();//初始化
pthread_mutex_lock();//上锁 参数:pthread_mutex_t *mutex
pthread_mutex_trylock();//判断上锁 参数:pthread_mutex_t *mutex
pthread_mutex_unlock();//解锁 参数:pthread_mutex_t *mutex
pthread_mutex_release();//消除互斥锁 参数:pthread_mutex_t *mutex
互斥锁分为快速互斥锁、递归互斥锁、检错互斥锁;在 init 的时候确定
int pthread_mutex_t(pthread_mutex_t *mutex, const pthread_mutex_t mutexattr);
第一个参数:进行操作的锁
mutexattr:锁的类型,默认快速互斥锁(阻塞)123456789
2、信号量:信号量本质上是一个计数器,在操作系统做用于PV原子操作;
P操作使计数器-1;V操作使计数器+1.
在互斥操作中可以是使用一个信号量;在同步操作中需要使用多个信号量,并设置不同的初始值安排它们顺序执行
sem_init(); // 初始化操作
sem_wait(); // P操作,计数器减一;阻塞 参数:sem_t *sem
sem_trywait(); // P操作,计数器减一;非阻塞 参数:sem_t *sem
sem_post(); // V操作,计数器加一 参数:sem_t *sem
sem_destroy(); // 销毁信号量 参数:sem_t *sem
sem_init(sem_t *sem, int pshared, int value);
pshared用于指定多少个进程共享;value初始值