Я строю небольшой сокет-сервер, на котором я хочу создать пул потоков, а затем работать в паттерне потоков начальник-рабочий. Таким образом, всякий раз, когда запрос (главный) получает запрос, он передается одному из рабочих потоков из пула.
В следующем фрагменте я пытаюсь создать 10 потоков.
void* process_data(void* arg) {
printf("invoked by the created thread");
while(1) {
// sleep until woken
// get item from queue
// do something
}
}
int total_threads_to_create = 10;
int total_created = 0;
while(total_created < 10) {
// create 10 threads
pthread_t thread;
int created = pthread_create(&thread, NULL, process_data, NULL);
if(created == 0) total_created++;
}
while(1) {
// server accepts the request in an infinite loop
int socket_fd = accept(ss_fd, (struct sockaddr*)&client_sock,&client_sock_len);
put_new_request_in_queue();
// signal to one of the thread that work is available
}
Как вы могли видеть выше, каждый новый поток напрямую вызывает метод process_data
. Теперь я хочу, чтобы поток внутри process_data
спал до тех пор, пока основной поток его не разбудил.
Как мне:
- заставить поток внутри
process_data
спать до тех пор, пока он не разбудил основной поток? - как я могу сообщить рабочему потоку, что существует запрос на обслуживание?