Вот немного более неловкое решение, которое гарантированно сработает: #include
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#define WORK_SIZE 1024
pthread_mutex_t work_mutex;
char input_area[WORK_SIZE];
char work_area[WORK_SIZE];
void *thread_start(void *);
int main()
{
pthread_t a_thread;
pthread_mutex_init(&work_mutex,NULL);
work_area[0] = 0;
pthread_create(&a_thread,NULL,thread_start,NULL);
while(1) {
printf("Enter some text\n");
fgets(input_area, WORK_SIZE, stdin);
pthread_mutex_lock(&work_mutex);
while (work_area[0] != 0) {
pthread_mutex_unlock(&work_mutex);
sleep(1);
pthread_mutex_lock(&work_mutex);
}
memcpy(work_area, input_area, WORK_SIZE);
pthread_mutex_unlock(&work_mutex);
}
return 0;
}
void *thread_start(void *arg)
{
while(1)
{
pthread_mutex_lock(&work_mutex);
if (work_area[0] > 0) {
printf("you enetered %d char\n",strlen(work_area));
work_area[0] = 0;
pthread_mutex_unlock(&work_mutex);
} else {
pthread_mutex_unlock(&work_mutex);
sleep(1);
}
}
}
Обратите внимание, что, поскольку мьютексные блокировки POSIX зависят от потока, потребительский поток не может ждать сигнала от потока производителя, поэтому здесь он просто просыпается каждую секунду, чтобы проверить наличие новых данных. Точно так же, если производителю необходимо поместить что-то в очередь, а рабочая область заполнена, он ждет в течение секунд, пока потребитель не приступит к опустошению буфера. Вы можете избавиться от некоторых задержек, используя pthread_yield
вместо sleep
, но тогда ваши потоки будут «заняты-ждут», потребляя много ресурсов ЦП, чтобы снова и снова проверять их состояние на соответствие
Обратите внимание, что если вы хотите, чтобы он печатал строку для 0-символьных записей, вы можете добавить отдельное значение bool, указывающее, есть ли новые данные в очереди.