Я пытаюсь заполнить буфер с помощью pthreads
в простой связи клиента TCP / IP-сервера.
ВНИМАНИЕ : Клиент записывает свое содержимое на внешний адрес сервера (не мой), а сервер считывает его содержимое с внешнего клиента. Клиент и сервер, которые я указал ниже, не взаимодействуют друг с другом.
Буфер заполняется двумя способами:
- Сервер читает сообщение и помещает егов буфер
- Клиент создает сообщение и помещает его в буфер
Вот клиентская функция :
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