【发布时间】:2017-01-02 05:28:15
【问题描述】:
我有一个使用 Java 和 C++ 编写代码的应用程序。 在这个应用程序中,我需要进行多次“试验”,持续时间正好为 N 秒(假设 N = 15)。 我还需要每 0.005 秒记录一次当前状态。 为此,我有以下代码:
std::thread timerTrial(&endTrial,this);
std::thread timerLog(&log,this);
std::thread timerTrial(&endTrial,this);
timerLog.detach();
timerTrial.detach();
void endTrial(){
usleep(TIME);
isOver = true ;
//...
}
void log(){
while(isOver == false){
usleep(TIMELOG);
//Do the logging
}
}
问题是当我查看我的日志记录(然后将其写入一个文件)时,我发现我得到了不同数量的日志记录行(这意味着一个试验的日志记录到例如 14.5 秒,另一个14.3 和另一个 14.8)。有什么办法可以改进这段代码,以减少每次试验之间的差异。
我认为我必须在log() 中进行的日志记录可能会导致一小段延迟,但老实说,这是一个非常小的日志记录(主要是将内容添加到 std::vector 中)。
我是否应该创建另一个并行线程来执行此日志记录,以免在log() 函数中的while 循环中浪费时间?
我缺乏改进此代码的想法,以减少每次试验之间的差异。我希望我的问题足够清楚。如果不能随意发表评论以寻求进一步的解释。
提前致谢,
【问题讨论】:
-
你可以使用一个条件变量,它在两个线程函数开始时被等待,并在某个时间点从主线程释放。
-
但即便如此......线程抢占的确定性完全取决于正在使用的调度程序。这是一个操作系统问题,而不是语言问题。
-
@LBes:线程的本质是它们在某个时刻轮流进行,无论是在处理中还是在数据访问中。编辑:在人们对我提出纯粹的并行性和只读取数据之前,我的意思是,OP 有一个 UI 线程和一个数据线程,听起来他们都需要接触相同的东西。他们将需要同步。
-
同样的问题,但仅限于 Java,被认为是有问题的stackoverflow.com/questions/3376586/…
-
@LBes 我并不是说没有办法,只是如果有办法,它就存在于你的程序和你正在运行的特定操作系统之间的 API 中。
标签: java c++ multithreading