【问题标题】:Replace fork() with pthread_create()用 pthread_create() 替换 fork()
【发布时间】:2012-02-01 04:36:31
【问题描述】:

谁能告诉我如何替换这个简单的代码来使用 pthread_create 而不是 fork()? 有可能吗?特别是,我对传递给 main() 的 struct *ex 有一些问题。 怎么改?

int k=0;
pthread_mutex_t mutex= PTHREAD_MUTEX_INITIALIZER;

struct primi{
    int s;
    int temp;};
struct example{
    int c;
    struct primi primissimi;};

//handler atfork()
void prepare(void){ 
    pthread_mutex_lock(&mutex);}
void parent(void){
    pthread_mutex_unlock(&mutex);}
void child(void){
    pthread_mutex_unlock(&mutex); }


void *funzione_thread(void* args){
   pthread_mutex_lock(&mutex);
   struct example *exthread = args;
   struct example locale = *exthread;
   locale.primissimi.s++;
   pthread_mutex_unlock(&mutex);
   //do something
   pthread_exit(NULL);
  }

int ffork(struct example *extmp){
   pthread_t id[5];
   int i;
   while(k<3){
      k++;
      pthread_create(&id[k],NULL,funzione_thread,extmp);
      }
   for(i=1;i<=3;i++){
      pthread_join( id[i] ,NULL );
      printf("waited thread %d\n",i);
      }
   printf("threads completed\n");
   return 1;
   }

 int main(int argc, char** argv){   
   struct example *ex = malloc(sizeof(*ex));
   int pid,tmp,err;
   if ((err = pthread_atfork(prepare, parent, child)) != 0){
       printf("can't install fork handlers");
       exit(-1);}
   pid=fork();
   if(pid==0){
      ex->c=1;
      ex->primissimi.s=1;
      if((tmp=ffork(ex))!=1){
          printf("error ffork\n");
          exit(0);
          }
          else{printf("ok ffork\n");
          pthread_exit (NULL);
          }
      }

else{
    sleep(10);
    }
return 1;
 }

【问题讨论】:

  • @BillyONEal 不是真的。我正在开发一个程序,我需要对其进行更改以获得功能。所以我简化了情况
  • 行“struct example locale = *exthread;”创建您随后修改的数据的副本,而不是指向现有数据的指针,因此修改不会显示在其他线程中。这是你说的问题吗?如果不是,请解释问题是什么,因为您非常模糊。
  • @tbert 不,问题出在 main 的结构中。我需要将它传递给 pthread_create(xxx,NULL,ffork,here that struct)
  • 你在做什么;我真的看不出你有什么问题。具体来说:a) 正在发生但您不希望发生的事情,或 b) 正在发生而应该 发生的事情?

标签: c multithreading pthreads fork


【解决方案1】:

fork() 创建一个新进程,
pthread_create() 产生一个新线程,这两个函数做的事情截然不同。进程和线程是不同的。
你确定你想要达到什么目标?

【讨论】:

  • @rschirin:问题是你的问题固执地说“我想把它从fork 更改为pthread_create,而不改变程序的行为”。但这是不可能的——这些功能做的事情完全不同,应用也完全不同。切换将对您的程序产生一些行为改变。您必须告诉我们您想要什么行为,以便我们帮助您。换句话说,预期的行为是什么?
  • @BillyONeal 我想创建一个线程并将其传递给函数 ffork(),然后它继续其正常行为,在 while 中创建其他 3 个线程。
【解决方案2】:

我认为基本的经验法则是 fork() 跨越一个进程,它不与父程序共享任何数据,而 pthread_create() 跨越一个线程(在 GNU/Linux 上,仍然是一个进程),它共享与父程序的数据。

详情请见http://www.makelinux.net/alp/032

因此,应该可以将所有 fork() 调用替换为 pthread_create() 调用,因为后者更灵活。

请记住,如果您进行更改,则必须更改程序的结构。主要是因为 fork()-spanned 进程将执行 fork() 系统调用之后的下一条指令。而对于pthread_create(),则必须将新进程的代码显式封装到一个函数中。

因此,第一步应该是将 fork() 命令之后的代码封装到一个独立函数中,然后将其传递给 pthread_create()。

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 2021-02-06
    • 2013-08-06
    • 1970-01-01
    • 2020-11-18
    • 2023-03-24
    相关资源
    最近更新 更多