【问题标题】:Only one process must execute a code portion at a time一次只有一个进程必须执行一段代码
【发布时间】:2011-09-01 10:41:55
【问题描述】:

很抱歉,我重复了一个问题https://stackoverflow.com/questions/5687837/monitor-implementation-in-c,但还没有得到解决方案。我可能问错了问题。

假设我有一个代码部分 B。父进程会产生许多子进程来执行代码 B,但我希望一次只有一个进程位于代码部分 B 内。如何在 Linux 平台上用 C 语言实现?

感谢您的帮助

编辑。不是线程而是进程。

【问题讨论】:

  • 我想建议你应该锁定你的数据,而不是你的代码。识别共享数据并确保锁定到位以保护共享数据。尝试锁定您的 代码 是编写意大利面条的快速方法。 :)
  • 您的另一个问题有很多已删除的答案,包括pthread_cond_wait - 但遗憾的是,所有者没有就他删除它的为什么发表评论。对我来说,这似乎是一个有用的起点……
  • 实际上我的 pthread_cond_wait 答案神秘地消失了。我不明白它发生了什么。
  • @Seth ...我最初也看到了另一个答案,但是当我昨天打开时...我看到只有一个答案,因为你说你的答案“神秘地”消失了

标签: c linux multithreading synchronization


【解决方案1】:

那么您想要的是在任何时间点都运行一个子进程,那么为什么要同时生成所有子进程呢?

当子进程结束时,发出SIGCHLD,您可以为此信号编写自己的处理程序并从处理程序调用spawn。然后,当一个进程消失时,您将创建一个新的子进程——只有一个子进程在运行。以下是实现此目的的 hack(无用,仅用于演示):

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>    

void spawn(void){

    pid_t child_pid=fork();

    if(child_pid > 0){
        printf("new child created by %d !\n",getpid()); 
        sleep(1);
    }else if(child_pid == 0){
        printf("child %d created !\n",getpid());

    }else{
        exit(EXIT_FAILURE);
    }
}


void handler(int sigval){
    spawn();    
}

int main(void){
    signal(SIGCHLD,handler);
    spawn();
    return 0;
}

【讨论】:

    【解决方案2】:

    你想要一个互斥锁。

    pthread_mutex_t mutexsum;
    pthread_mutex_init(&mutexsum, NULL);
    pthread_mutex_lock (&mutexsum);
    // Critical code
    pthread_mutex_unlock (&mutexsum);
    

    如果您认真对待它是多个进程而不是多个线程,则互斥锁需要存储在共享内存段中。

    【讨论】:

    • 如果要将互斥锁放入共享内存,请查看shmget(2) 和朋友。
    • 对于共享段,我觉得shm_open接口加上mmap比较好处理。
    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 2014-06-17
    相关资源
    最近更新 更多