【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

Linux下进程同步问题小例

原创 2017年01月03日 10:15:11

以下代码利用mmap给内存文件分配空间,利用fork产生父子进程,通过semaphore中的信号量进行同步和死锁操作。完成了父子进程的同步运行。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <sys/mman.h>
int* count = 0;
sem_t *mutex1 = NULL;
sem_t *mutex2 = NULL;
int finish = 0;
int main()
{
    mutex1 = (sem_t*)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
    mutex2 = (sem_t*)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
    count = (int*)mmap(NULL,sizeof(int), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1,0);
    sem_init(mutex1, 1, 1);
    sem_init(mutex2, 1, 0);
    *count = 0;
    if(fork()==0)
    {
        while(1)
        {
            printf("child continue!\n");
            sem_wait(mutex1);
            *count += 2;
            printf("child:%d\n",*count);
            finish++;
            sem_post(mutex2);
            if(finish == 10)
                break;
        }
        printf("child Finish!\n");
        exit(0);
    }

    while(1)
    {
        printf("father continue!\n");
        sem_wait(mutex2);
        *count -= 1;
        printf("father:%d\n",*count);
        finish++;
        sem_post(mutex1);
        if(finish == 10)
            break;
    }
    sem_destroy(mutex1);
    sem_destroy(mutex2);
    munmap(mutex1, sizeof(sem_t));
    munmap(mutex2, sizeof(sem_t));
    munmap(count, sizeof(int));
    printf("Finished All!\n");
    return 0;
}

在linux下进行编译

[root@localhost myfile]# gcc testsem.c  -o testsem -lpthread

运行结果:

[root@localhost myfile]# ./testsem 
father continue!
child continue!
child:2
child continue!
father:1
father continue!
child:3
child continue!
father:2
father continue!
child:4
child continue!
father:3
father continue!
child:5
child continue!
father:4
father continue!
child:6
child continue!
father:5
father continue!
child:7
child continue!
father:6
father continue!
child:8
child continue!
father:7
father continue!
child:9
child continue!
father:8
father continue!
child:10
child continue!
father:9
father continue!
child:11
child Finish!
father:10
Finished All!
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Linux下的进程同步机制 – 记录锁

当可能出现几个进程争用(读、写)同一个Critical Section的时候,加锁是常用的做法。 Linux加锁的方法,除了经典的IPC(Semophore)之外,记录锁(Record Lockin...

操作系统常见问题解答

(一)进程与线程的区别,线程安全”怎么理解? 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应得并发性。进程和线程的区别在于: 一个

多进程编程

什么是一个进程?进程这个概念是针对系统而不是针对用户的,对用户来说,他面对的概念是程序。当用户敲入命令执行一个程序的时候,对系统而言,它将启动一个进程。但和程序不同的是,在这个进程中,系统可能需要再启动一个或多个进程来完成独立的多个任务。多进程编程的主要内容包括进程控制和进程间通信,在了解这些之前,我们先要简单知道进程的结构。 2.1 Linux下进程的结构 Linux下一个进程在内存里有三部分的数据,就是"代码段"、"堆栈段"和"数据段".其实学过汇编语言的人一定知道,一般的CPU都有上述三种段寄存器,以方便操作系统的运行。这三个部分也是构成一个完整的执行序列的必

深刻理解Linux进程间通信(IPC)

深刻理解Linux进程间通信(IPC) 0. 序 1. 管道 1.1. 管道概述及相关API应用 1.2. 有名管道概述及相关API应用 1.3. 小结 1.4. 参考资料 2. 信号(上)...

linux 笔记

linux 笔记 2010年10月31日   很久前就打算把这些笔记写下来,由于种种原因一直没动,打算从今天起慢慢的把自己学习linux的过程写下来,对与错请CU的各位前辈指点,非常感谢牛海峰(JohnBull)老师,您是我的linux启蒙老师,俗话说"师傅领进门修行靠个人",非常汗颜,我自打离开长城后就很少拿出精力来研究linux了,磕磕绊绊走过了一年,现在工作有了着落,静下心来把一年的心情整理一番,也把学习笔记拿出来,请CU前辈指正。 jins

深刻理解Linux进程间通信(IPC)

深刻理解Linux进程间通信(IPC) 深刻理解Linux进程间通信(IPC) 0. 序 深刻理解Linux进程间通信(IPC) 深刻理解Linux进程间通信(IP...
  • junht
  • junht
  • 2013-04-10 10:58
  • 2248

修炼一名程序员的职业水准

程序就是一系列按步骤进行的操作序列,它有好多种级别,比如最低级的微程序、次低级的汇编程序、高级的各种编程语言程序、最高级的脚本语言程序,也许我列的不对,但没关系,我要说的是不管是那个级别的程序,其本质都是操作的逻辑序列。大多数系统和应用程序都是建立在高级编程语言上的,比如C、C++、C#、FORTRAN、BISIC、JAVA等等,就让我们只关注这一级的编程能力吧。因此如果一个程序员的逻辑能力不高,他永远都不能成为一名具有合格职业水准的程序员,我们在下面的讨论有关编程能力的方方面面,最终都是为了最大程度地提高和实现一名程序员的逻辑能力。 作者:林庆忠,1990年毕业于昆明工学院计算机软

Linux下的多进程编程初步

Linux下的多进程编程初步 Linux下的多进程编程初步 多进程编程 1 Linux下进程的结构2 Linux下的进程控制 21 僵尸进程22 fork23 ...

Linux进程同步之POSIX信号量

POSIX信号量是属于POSIX标准系统接口定义的实时扩展部分。在SUS(<span style="font-family: Times New R

Linux进程间通信深刻理解

深刻理解Linux进程间通信(IPC) 0. 序 1. 管道 1.1. 管道概述及相关API应用 1.2. 有名管道概述及相关API应用 1.3. 小结 1.4...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)