Проектирование с использованием IDE (Отчет о выполнении научно-исследовательской работы), страница 8

{

    pthread_create( &t1, NULL, thread1, NULL );

   pthread_create( &t2, NULL, thread2, NULL );

    pthread_join( t1, NULL );

    pthread_join( t2, NULL );

    return;

}

void *thread2( void *t )

{

   int      coid;

      int   status;

      int pid=getpid();

      char  send_buf[25],

      reply_buf[25];

      printf("%d", pid );

      coid=ConnectAttach(0,pid,1,0,0);

      if (coid==-1){

                  printf("Error ConnectAttach\n");

                  perror (NULL);

int   coid;

      int   status;

      int pid=getppid();

      char  send_buf[25],

      reply_buf[25];

      printf("%d", pid );

      coid=ConnectAttach(0,pid,1,0,0);

      if (coid==-1){

                  printf("Error ConnectAttach\n");

                  perror (NULL);

                  exit (EXIT_FAILURE);

      }

;     strcpy(send_buf, "Client: Answer");

;     printf("\nCLIENT: I send [%s]\n", &send_buf );

      status=MsgSend(coid,  &send_buf, sizeof(send_buf), &reply_buf, sizeof(reply_buf));

      if (status==-1){

                  printf("Error MsgSend\n");

                  perror (NULL);

                  exit (EXIT_FAILURE);

      }

      if(strlen(reply_buf)>0){

            printf("Pr : \"%s\"\n", reply_buf);

      }

      printf("\nEnd Client\n");

      ConnectDetach(coid);

      return EXIT_SUCCESS;

                  exit (EXIT_FAILURE);

      }

      strcpy(send_buf, "Client: Answer");

      printf("\nCLIENT: I send [%s]\n", &send_buf );

      status=MsgSend(coid,  &send_buf, sizeof(send_buf), &reply_buf, sizeof(reply_buf));

      if (status==-1){

                  printf("Error MsgSend\n");

                  perror (NULL);

                  exit (EXIT_FAILURE);

      }    

      if(strlen(reply_buf)>0){

            printf("Pr : \"%s\"\n", reply_buf);

      }

      printf("\nEnd Client\n");

      ConnectDetach(coid);

      return EXIT_SUCCESS;

}

void *thread1( void *t )

{

      int   rcvid, chid, pid, ppid;

      char  receive_buf[25], reply_buf[25];

      chid=ChannelCreate(0);

      while(1){

      rcvid=MsgReceive(chid, &receive_buf, sizeof(receive_buf), NULL);

      printf("\nSERVER: I receive [%s]\n", &receive_buf );

      strcpy(reply_buf, "Answer");

      printf("\nSERVER: I reply [%s]\n", &reply_buf );

      MsgReply(rcvid, 777, &reply_buf, sizeof(reply_buf));

      }

      ChannelDestroy(chid);

      printf("\nEnd server\n" );

      return EXIT_SUCCESS;

}

Рис.17

Рис. 18.

На рисунках 8, 9 представлен обмен сообщениями между потоками одного процесса.

Рис. 19

На рис. 19 выделены моменты отправки, приема, ответа на сообщение при взаимодействии потоков. Время реакции сервера – 1.386 мс, что в 4 раза больше, чем при обмене между независимыми процессами (стр. 10), что говорит об удобстве и высокой производительности программ с использованием механизма регистрации имени.