一个进程和另一个具有多个线程的进程是否可以与一个共享资源同步

时间:2016-08-11 10:04:19

标签: c linux

我有一个使用共享资源的进程和一个具有多个线程的进程,但是这个进程也使用了我想知道的同一个共享资源可以在一个进程中使用这些多个线程而另一个进程可以同步在linux中使用相同的共享资源?"

    fi1e1.c
    #include<stdio.h>
    #include<pthread.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<unistd.h>
    #include<fcntl.h>
    #include<semaphore.h>
    sem_t *sem;
    void * call_processing(void*p){
        printf(" tid %u\n",pthread_self());

        while(1){
            sem_wait(sem);
            printf("shivInside sem tid %u \n",pthread_self());
            //  sleep(2);
            while(1);
            sem_post(sem);
            printf("shivAfter sem tid %u \n",pthread_self());
        }
    }
    void * call_processing1(void*p){
        printf(" tid %u\n",pthread_self());

        while(1){
            sem_wait(sem);
            printf("Inside sem tid %u  \n",pthread_self());
            sleep(5);
            sem_post(sem);
        }
    }

    main(int argc ,char **argv){

        pthread_t tid,tid1;
        sem = sem_open( argv[1], O_CREAT, 0666,  1);
        printf("sem=%d\n",sem);
        if ( sem < 0)
        {
            perror("sem_open: ");
            exit(1);
        }


        if (pthread_create(&tid, NULL, &call_processing, NULL) != 0) {
            printf ("Unable to create the Call processing thread \n");
        }


        if (pthread_create(&tid1, NULL, &call_processing1, NULL) != 0) {
            printf ("Unable to create the Call processing thread \n");
        }

        while(1);
    }
    ======================================================================
    File 2.c
    #include<stdio.h>
    #include<semaphore.h>

    sem_t *sem;


    main(int argc ,char **argv){


        sem = sem_open(argv[1],1);
        if(sem<0){
            perror("sem_init");
        }
        sem_wait(sem);
        printf("hi\n");
        sem_post(sem);

}

1 个答案:

答案 0 :(得分:0)

当然可以。但要注意 - 如果您在信号量的值当前为零时终止fi1e1进程(可能是由于while(1);之后的无限sem_wait(sem);循环),该值仍将是从下一个fi1e1开始为零(sem_open( argv[1], O_CREAT, 0666, 1)仅为新信号量设置初始值),因此程序&#39 ;第二次运行将与第一次运行的行为不同。您可以通过删除其虚拟文件系统名称/dev/shm/sem.…来删除信号量。