【问题标题】:Convert Pthread to process fork()将 Pthread 转换为进程 fork()
【发布时间】:2020-08-17 21:27:42
【问题描述】:

使用下面这个基本的pthread 代码,将pthread_create 转换为fork() 并达到类似结果的方法是什么。

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h> 
#include <unistd.h>
sem_t mutex; 
void* wait_t(void* a)
{
    (int)a--;
    if ((int)a < 0)
    {
        sem_wait(&mutex);
        printf("waiting\n");
    }
}
void* signal_t(void* a)
{
    (int)a++;
    if ((int)a <= 0)
    {
        printf("signal\n");
        sem_post(&mutex);
    }
}
int main()
{
    sem_init(&mutex, 0, 1);
    int i = -2;
    pthread_t t1, t2; 
    pthread_create(&t1, NULL, wait_t, i);
    pthread_create(&t2, NULL, signal_t, i); 
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    exit(0); 
}

【问题讨论】:

  • 您必须使用fork() 创建两个子进程,并在每个子进程中调用函数wait_tsignal_t
  • @peachykeen 那个问题是关于如何使用fork() 这个问题convert pthread to process 并达到类似的结果

标签: c multithreading pthreads fork posix


【解决方案1】:

除非我遗漏了什么,否则下面的代码允许您使用进程而不是线程来实现相同的功能。

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

sem_t mutex; 
void wait_t(int a)
{
    a--;
    if (a < 0)
    {
        sem_wait(&mutex);
        printf("waiting\n");
    }
}

void signal_t(int a)
{
    a++;
    if (a <= 0)
    {
        printf("signal\n");
        sem_post(&mutex);
    }
}

int main()
{
    sem_init(&mutex, 0, 1);
    int i = -2;

    if(fork() == 0){ // create 1st child process
        wait_t(i);
        exit(0);
    }

    if(fork() == 0){ // create 2nd child process
        signal_t(i);
        exit(0);
    }


    wait(NULL);
    wait(NULL);

    exit(0); 
}

注意:我不验证fork() 抛出的任何可能的错误,因为这是可取的。

【讨论】:

  • 为什么不使用pid_t来标记每个进程。
  • 您可以根据需要使用它,但在原始示例中您没有使用此信息,因此我没有在答案中使用它。您可以使用getpid()获取每个进程的PID,每个进程的父进程可以通过fork()获取该值,如果成功,则返回刚刚创建的子进程的PID。
猜你喜欢
  • 1970-01-01
  • 2014-12-12
  • 2010-10-13
  • 1970-01-01
  • 2021-12-14
  • 2017-06-27
  • 1970-01-01
  • 2015-03-28
  • 2019-04-23
相关资源
最近更新 更多