考虑以下情况:
2个线程,其中1应该初始化一些数据,这需要不确定的时间,而另一个线程需要等待。
我遇到的问题:
- 在这两个线程中的任何一个运行之前,我都不能做任何事情,因为我无法控制生成过程(C代码是以类似脚本的方式编译和执行的)
- 我不知道init线程是否在另一个线程之前到达代码中的任何点,因为它们是一个接一个地启动的,从我的角度来看,从这个执行顺序变得不确定
- 我需要确保主线程的init部分首先运行(例如,其他线程不应该尝试使用未初始化的)
- 我想在之后清理我用于同步的任何东西,因为这是一个长时间运行的过程中的一次性事情,即使是非常小的内存节省也很重要。例如,互斥/信号量应该在之后被销毁
我怎样才能做到这一点?
编辑:我(不幸地)在最初的问题中遗漏了一件可能并不那么重要的事情:我可以访问一些指针,这些指针可以从所有线程访问,并且在开始时应该为NULL,所以这可能有助于同步。
编辑2:通过实验,我发现"另一个线程"实际上总是派生的,一个函数被调用,需要在主线程启动之前返回。不幸的是,我不得不在这一点上等待主线程完成它的工作,这使得整个事情变得不可能。因此,从现在起,这个问题可以从理论上考虑(希望在软件提供商改变这一点或提供一种工作方式后再次实用)
还添加了g-wan(web服务器执行c脚本作为servlet/处理程序/维护脚本)标签-最初我不想添加这个标签,因为这个问题不是软件特有的,但看起来它可能有助于理解"为什么"以及环境;在我的例子中,"main"线程是维护脚本,"other thread"是连接处理程序。
在软件供应商的支持/帮助下,我的问题已经"解决"了,所以我现在接受pthread_cond_wait的答案,因为据我所知,它通常是正确的。
假设使用pthread
,则可以使用pthread_cond_wait
同步线程。当第一个线程完成了它的任务时,用信号通知条件变量,第二个线程应该使用pthread_cond_wait
来等待相同的条件变量。
1.也许你可以用other thread
作为父线程,它用fork
来创建init thread
。父线程用wait
或waitpid
来等待init thread
。
2.如果只有两个线程,你可以使用signal
。就像init thread
完成后一样。它发送一个signal
,而其他线程阻塞自己并等待信号。一旦它收到信号,它就会做干净的工作。