- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的用例中我需要一个快速的线程唤醒机制。所以我写了一个简单的基准测试来看看信号量有多好。
#define PCALL(f) \
do { \
if (f == -1) { \
perror(#f); \
abort(); \
} \
} while (0)
bool should_stop = false;
namespace semaphore_pthread{
struct Arg {
sem_t start, stop;
} sems;
inline void SemInit(sem_t* sem) { PCALL(sem_init(sem, 0, 0)); }
inline void SemPost(sem_t* sem) { PCALL(sem_post(sem)); }
inline void SemWait(sem_t* sem) {
int ret;
do {
ret = sem_wait(sem);
} while (ret == -1 && errno == EINTR);
}
inline void SemDestroy(sem_t* sem) { PCALL(sem_destroy(sem)); }
void* StopperFunc(void *arg) {
while (true) {
SemWait(&sems.start);
if (should_stop) break;
SemPost(&sems.stop);
}
return nullptr;
}
int num_iters;
void* StarterFunc(void* arg) {
pthread_t stopper;
PCALL(pthread_create(&stopper, nullptr, &StopperFunc, nullptr));
StartBenchmarkTiming();
for (int i = 0; i < num_iters; ++i) {
SemPost(&sems.start);
SemWait(&sems.stop);
}
StopBenchmarkTiming();
should_stop = true;
SemPost(&sems.start);
PCALL(pthread_join(stopper, nullptr));
return nullptr;
}
void BM_Sem(int iters) {
num_iters = iters;
pthread_t starter;
PCALL(pthread_create(&starter, nullptr, &StarterFunc, nullptr));
PCALL(pthread_join(starter, nullptr));
}
这只是两个线程在做乒乓球一样醒来。每次迭代包括两次唤醒。
在我的机器上(Intel(R) Xeon(R) CPU E5-1650 0 @ 3.20GHz),每次迭代大约需要 5us。我也尝试过 eventfd 和 futex,但它们提供了相似的结果。但是,如果使用 taskset -c 1
(所有线程都运行在 CPU 1 中),它只需要 1.5 us。这背后的原因是什么?有没有办法以编程方式实现相同的效果,而不是依赖于任务集?
最佳答案
要使用 C 而不是 taskset
程序将您的进程绑定(bind)到单个核心,您可以使用 sched_setaffinity .
至于为什么将两个线程放在一个内核上会更快,可能有以下几点:
关于linux - 为什么使用 taskset -c 时线程唤醒要快得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36973230/
我是 Locust 新手,我正在尝试编写负载测试。我想知道将我想要执行的任务定义为可调用函数与将它们定义为 locust TaskSet 类有什么区别。例如: class MyTaskSet(Task
在我的用例中我需要一个快速的线程唤醒机制。所以我写了一个简单的基准测试来看看信号量有多好。 #define PCALL(f) \ do { \ if (f == -
谁能告诉我如果我跑会发生什么 taskset -c 7 ./fred.x 但是在 fred.x 中,一个线程正在调用 sched_setaffinity 来绑定(bind)到核心 6? 该线程是否会获
我在 ubuntu 上运行以下命令: taskset -c 1 ./forLoop 它给了我以下错误: ./forLoop: 1: Syntax error: Bad for loop variabl
期望的行为:在使用 isolcpus 隔离的一组内核上运行多线程 Linux 程序。 这是一个我们可以用作示例多线程程序的小程序: #include #include #include #inc
我是 Locust 的新手,正在尝试编写负载测试。我的 Locust 用户的目的是通过调用 createItem API 来创建项目。在这种情况下,每个请求中的 item_id 应该是唯一的,因为它具
我是一名优秀的程序员,十分优秀!