【发布时间】:2020-01-05 14:50:54
【问题描述】:
我想知道我应该如何解决以下问题。我的 c 程序将接收 3 个参数 - 要调用的路径、术语和线程数。
我应该在 path 的任何子目录中探索名称中包含 term 的文件。如果我的程序是异步的,那将是一项相当容易的工作。
我正在为我的线程使用共享队列,并使用锁和条件变量进行同步。
我的逻辑如下 -
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..)
}
这是一个伪代码而不是真正的代码,但我更担心我的逻辑而不是我的实现。 我的问题是,我如何向我的线程发出空队列信号以结束其功能的信号,并且在队列包含某些路径之前,这不仅仅是暂时的。
我很想听听你的意见!
【问题讨论】:
-
你的入口是错误的。互斥体应该在调用
pthread_cond_wait之前被锁定(事实上,在进入循环本身之前),此外,在调用返回时它已经被锁定,除非出现错误。冒着听起来自私的风险,read this. -
未显示的代码会初始化
cond和mute,不是吗? -
你不应该在锁定互斥锁的情况下递归
iterate_dir(),对吗?它将限制并发性。
标签: c multithreading pthreads