使用线程互斥量,实现进程的PV操作

问题模型:
初始:S1=1,S2=0;
父进程:P(S2)
            print
           V(S1)

子进程:P(S1)
            print
            V(S2)
在不同进程间使用线程上锁的要求:(1)互斥锁变量必须存放在由所有进程共享的内存区中
                                                (2)必须告知线程库函数这是在不同进程之间共享的互斥锁
第一个要求可以使用文件映射技术建立父子进程的共享存储区;第二个要求可以通过设置互斥锁的
PTHREAD_PROCESS_SHARED属性。转载请尊重原创、保留相关链接本文来自多宝平台http://www.mbodb.com

点击(此处)折叠或打开

  1. /*
  2. *线程同步对象:互斥量,读写锁,条件变量通常用于线程同步,但这些同步对象都有一个“进程共享属性”,
  3. *当对相应同步对象设置了这个属性,这些对象就能用于进程间的控制。
  4. */
  5. #include <stdio.h>
  6. #include <stdlib.h> 
  7. #include <pthread.h>
  8. #include <fcntl.h>
  9. #include <sys/mman.h>

  10. static pthread_mutex_t *mptr1;//定义两个互斥锁指针分别指向S1,S2
  11. static pthread_mutex_t *mptr2;

  12. int
  13. main(int argc,char** argv)
  14. {
  15.   int i,fd;
  16.   pthread_mutexattr_t mattr1;//互斥锁属性
  17.   pthread_mutexattr_t mattr2;
  18.   if(argc<2)
  19.     return;
  20.   i=atoi(argv[1]);//交替输出的次数
  21.   fd=open("/dev/zero",O_RDWR,0);
  22.   mptr1=mmap(0,2*sizeof(pthread_mutex_t),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//建立共享存储区,大小能容纳两个互斥锁,并是第一个互斥锁指针指向共享存储区开始的位置
  23.   close(fd);
  24.   mptr2=mptr1+sizeof(pthread_mutex_t);//第二个互斥锁的位置

  25.   pthread_mutexattr_init(&mattr1);//初始化互斥锁的属性
  26.   pthread_mutexattr_setpshared(&mattr1,PTHREAD_PROCESS_SHARED);//设置互斥锁属性为进程共享
  27.   pthread_mutex_init(mptr1,&mattr1); //将进程共享属性设置在相应互斥锁上

  28.   pthread_mutexattr_init(&mattr2);//同样设置第二个互斥锁的属性
  29.   pthread_mutexattr_setpshared(&mattr2,PTHREAD_PROCESS_SHARED);
  30.   pthread_mutex_init(mptr2,&mattr2); 

  31.   pthread_mutex_lock(mptr2); //使S2=0,多宝父进程阻塞,子进程先执行
  32.   if(fork()==0)
  33.   { 
  34.    while(i>0)
  35.     {
  36.       pthread_mutex_lock(mptr1);//P(S1)

  37.       printf("child:%d\n",i);
  38.       i--;
  39.       
  40.       pthread_mutex_unlock(mptr2);//V(S2)
  41.     }
  42.    exit(0);
  43.   }
  44.   while(i>0)
  45.   {
  46.     pthread_mutex_lock(mptr2);//P(S2)

  47.     printf("parent:%d\n",i);
  48.     i--;

  49.     pthread_mutex_unlock(mptr1);//V(S1)
  50.   }
  51.   exit(0);
  52. }

运行结果:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux中,可以使用信号和PV原语操作机制实现进程的同步和互斥。 1. 同步机制:可以使用信号实现进程的同步。信号是一种计数器,它用来控制多个进程对共享资源的访问。在Linux中,信号由semget、semop和semctl三个系统调用来完成。 2. 互斥机制:可以使用PV原语操作机制来实现进程互斥。PV原语操作机制可以实现原子操作,保证多个进程对共享资源的访问是互斥的。在Linux中,PV原语操作机制由semaphore.h头文件中的sem_init、sem_wait和sem_post三个函数来实现。 下面是一个简单的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <semaphore.h> sem_t sem; // 定义信号 void *thread_func(void *arg) { sem_wait(&sem); // 等待信号 printf("Thread %d is running\n", *(int *)arg); sem_post(&sem); // 发送信号 return NULL; } int main() { sem_init(&sem, 0, 1); // 初始化信号 pthread_t tid[5]; int i; for (i = 0; i < 5; i++) { int *arg = malloc(sizeof(int)); *arg = i; pthread_create(&tid[i], NULL, thread_func, arg); // 创建线程 } for (i = 0; i < 5; i++) { pthread_join(tid[i], NULL); // 等待线程结束 } sem_destroy(&sem); // 销毁信号 return 0; } ``` 在上面的示例代码中,我们使用了sem_wait和sem_post函数来实现线程的同步。在每个线程中,我们使用sem_wait函数等待信号,当信号的值为1时,线程可以继续执行。在线程执行完后,我们使用sem_post函数发送信号,将信号的值加1,以便其他线程可以继续执行。同时,我们使用sem_init函数初始化信号使用sem_destroy函数销毁信号

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值