【发布时间】:2017-11-10 14:54:45
【问题描述】:
您能想出为什么原子操作看起来比信号量慢的任何充分理由吗?即使指令减少了?
示例代码:
void increment(){
if (strcmp(type, "ATOMIC") == 0) {
for (int i = 0; i < RUN_TIME; ++i) {
atomic_fetch_add_explicit(&count, 1, memory_order_relaxed);
}
}
if (strcmp(type, "SEMAPHORE") == 0){
for (int i = 0; i < RUN_TIME; ++i) {
sem_wait(sem);
count++;
sem_post(sem);
}
}
}
输出:
time ./CMAIN "SEMAPHORE";time ./CMAIN "ATOMIC";
[C] SEMAPHORE, count 4000000
real 0m0.039s
user 0m0.029s
sys 0m0.002s
[C] ATOMIC, count 4000000
real 0m0.092s
user 0m0.236s
sys 0m0.003s
【问题讨论】:
-
您是否尝试过实际的多线程应用程序?这看起来像是在执行串行操作,因此没有资源争用,信号量也不必等待。
-
如果不给我们编译器和平台,你只能期待一些挥之不去的推测性答案。
-
'减少指令'。你的意思是更少的c代码行?那完全无关紧要。
-
真的吗?如果更多指令被推入流水线,从而产生更高的总延迟,这无关紧要吗?
标签: c multithreading semaphore atomic operations