pthreads заполняет буфер неожиданным образом - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь заполнить буфер с помощью pthreads в простой связи клиента TCP / IP-сервера.

ВНИМАНИЕ : Клиент записывает свое содержимое на внешний адрес сервера (не мой), а сервер считывает его содержимое с внешнего клиента. Клиент и сервер, которые я указал ниже, не взаимодействуют друг с другом.

Буфер заполняется двумя способами:

  1. Сервер читает сообщение и помещает егов буфер
  2. Клиент создает сообщение и помещает его в буфер

Вот клиентская функция :

void *client(void *threadid)
{
  //CLIENT INITIALIZATION AND CONNECT TO SERVER PROPERLY
  //sleep(1);   //sleep 1 second before you send again
  char *buff = "message1";   //message1,2,3 etc is defined by a random function

  pthread_mutex_lock(&lock);

  write(sockfd, buff, strlen(buff)+1);

  buffer_fill(buff);
  pthread_mutex_unlock(&lock);
  }
  pthread_exit(NULL);
 }

Издесь функция сервера . Сервер читает с внешнего устройства, которое выполняет тот же код клиента со мной :

void *server(void *threadid)
{
  //SERVER INITIALIZATION USING THE PROPER PORT AND ADDRESS
  pthread_mutex_lock(&lock);
  bzero(buff, MAX_LENGTH);
  // read the message from client and copy it in buffer
  while(strlen(buff) == 0){
    read(sockfd, buff, sizeof(buff));
  }
  buffer_fill(buff);
  pthread_mutex_unlock(&lock);
  }
  pthread_exit(NULL);
}

Я использую простую инициализацию pthread в моей функции main. Поэтому я вызываю каждую функцию с использованием потока:

int main(int argc, char **argv)
{

  pthread_t threads[NUM_THREADS];
  int rc[NUM_THREADS];
  long t;

  for(t=0; t<NUM_THREADS; t++){

    //initiallize thread
    if (pthread_mutex_init(&lock, NULL) != 0)
    {
        printf("\n mutex init failed\n");
        return 1;
    }


    //create each thread according to value of t
    if(t==0){
      rc[t] = pthread_create(&threads[t], NULL, server, (void *)t);
    }else if(t==1){
      rc[t] = pthread_create(&threads[t], NULL, client, (void *)t);
    }

  }

  pthread_join(tid[0], NULL);
  pthread_join(tid[1], NULL);
  pthread_mutex_destroy(&lock);

  /* Last thing that main() should do */
  pthread_exit(NULL);

  return 0;
}

Я предполагаю, что проблема заключается где-то в использовании (чрезвычайно простого) buffer_fill(char *message) в сочетании с потоками ( примечание: msg - это глобальная переменная, инициализированная нулем вне main, int msg = 0):

void buffer_fill(char *m){

  if (msg<=MAX_MESSAGES){
    buffer[msg] = m;
    msg ++;
  }
  print_buffer();
}

Когда я выполняю этот код непрерывно, я получаю такой результат:

first print:
message2

second print:
message1
message1

third print:
message5
message5
message5

и так далее.

  • Обратите внимание, что сообщения [1: 5] выбираются клиентом случайным образом и не влияют на результат
  • Уверяю вас, что серверный клиент настроен правильно. Я проверил это перед написанием кода, который заполняет буфер

Почему сообщения печатаются так, а не в последовательном виде? Я хочу, чтобы каждое случайное сообщение, которое будет записано клиентом, и каждое сообщение, читаемое сервером, были помещены в буфер один за другим, как показано ниже:

first print:
message2

second print:
message2
message1

third print:
message2
message1
message5
...