Замените fork () на pthread_create () - PullRequest
1 голос
/ 01 февраля 2012

Может кто-нибудь показать мне, как заменить этот простой код, чтобы использовать pthread_create вместо fork ()?Возможно ли это? В частности, у меня есть некоторые проблемы с struct * ex, переданной в main ().как мне это изменить?

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;
 }

Ответы [ 2 ]

5 голосов
/ 01 февраля 2012

fork() создает новый процесс,
pthread_create() порождает новый поток, обе функции делают совершенно разные вещи.Процесс и поток различны.
Вы уверены, что пытаетесь достичь?

0 голосов
/ 14 апреля 2012

Я думаю, что основное правило заключается в том, что fork () охватывает процесс, который не делится данными с родительской программой, в то время как pthread_create () охватывает поток (в GNU / Linux, все еще процесс), который разделяетданные с родительской программой.

Подробнее см. http://www.makelinux.net/alp/032.

Таким образом, должна быть возможность заменить все вызовы fork () вызовами pthread_create (), поскольку последнийявляется более гибким.

Помните, что структура вашей программы должна быть изменена, если вы сделаете это изменение.Главным образом потому, что процесс fork () будет выполнять следующую инструкцию после системного вызова fork ().В то время как для pthread_create () вы должны явно инкапсулировать код нового процесса в функцию.

Итак, первый шаг должен заключаться в инкапсуляции кода, следующего за командой fork (), в отдельную функцию, которую выпозже перейдите к pthread_create ().

...