【发布时间】:2016-12-04 06:41:16
【问题描述】:
我正在尝试在我的应用程序中检测某些功能以查看它们需要多长时间。我正在使用链表在内存中记录所有时间。
在此过程中,我引入了一个跟踪列表末尾的全局变量。当我进入一个新的计时区域时,我会在列表的末尾插入一条新记录。相当简单的东西。
但是,我想跟踪的一些函数是在 OpenMP 区域中调用的。这意味着它们可能会被并行调用多次。这就是我难过的地方。
如果这是使用普通的 Pthreads,我只需将对全局变量的访问封装在互斥锁中,然后就可以结束了。但是,我不确定:此策略是否仍适用于 OpenMP 区域中调用的函数?比如,他们会尊重锁吗?
例如(不会编译,但我想明白了):
Record *head;
Record *tail;
void start_timing(char *name) {
Record *r = create_record(name);
tail->next_record = r;
tail = r;
return r;
}
int foo(void) {
Record r = start_timing("foo");
//Do something...
stop_timing(r);
}
int main(void) {
Record r = start_timing("main");
//Do something...
#pragma omp parallel for...
for (int i = 0; i < 42; i++) {
foo();
}
//Do some more...
stop_timing(r);
}
然后我会更新到:
void start_timing(char *name) {
Record *r = create_record(name);
acquire_mutex_on_tail();
tail->next_record = r;
tail = r;
release_mutex_on_tail();
return r;
}
(抱歉,如果这有一个明显的答案 - 我对 OpenMP 框架和一般的多线程相对缺乏经验。)
【问题讨论】:
-
如果你的 Openmp 是基于 pthreads 构建的(通常是 Linux 或 osx),它应该可以工作。
标签: c multithreading locking openmp