Мне было интересно, как мне подойти к следующей проблеме. Моя c программа получит 3 аргумента - путь, срок и количество потоков для вызова.
Я должен изучить файлы, которые содержат термин в своем имени, в любом из подкаталогов path . Если бы моя программа была асинхронной, это была бы довольно легкая работа.
Я использую общую очередь для своих потоков, с lock и условной переменной для синхронизации.
My logi c выглядит следующим образом -
int main(int argc, char *argv)
{
...
Queue *queue = init_queue();
enqueue(queue, root_path);
for (int i = 0; i<n_threads; ++i)
pthread_create(..., thread_handle, ...);
...
}
void thread_handle()
{
while (!queue_empty)
{
while(!condition_variable)
pthread_cond_wait(&cond);
pthread_mutex_lock(&lock);
QNode *node = dequeue(queue);
iterate_dir(node->path);
pthread_mutex_unlock(&lock);
thread_cond_signal(condition_variable);
}
}
void iterate_dir(...)
{
// Directory search logic (with enqueue..)
}
Это скорее псевдо-код, чем реальный код, но меня больше беспокоит моя логика c, чем моя реализация. У меня вопрос: как я могу сигнализировать своим потокам, что пустые сигналы очереди заканчивают свою функцию, и это не просто временно, пока в очереди не будет указан какой-либо путь.
Я хотел бы услышать ваше мнение!