如何在C pthreads中并行化线程
我有N个线程,他们必须在共享数据上完成任务。如何在C pthreads中并行化线程
我使用的结构如下:
int main(){
pthread_create(..., func, ...);
}
void *func(void *id){
lock;
do_job;
unlock;
}
我的问题是,线程似乎顺序工作。如何让他们平行?
他们正在序列化,因为你在整个操作中持有锁。要真正获得并行你需要做这样的事情:
void func(void *id) {
lock;
do something serialised with shared data;
unlock;
do something that can be parallelised safely;
lock;
do something else with shared data;
unlock;
}
诀窍(因为它是在什么线程或其他并行化)正在抓紧你需要为了不打破东西连载。这是不是容易。
在你的例子中,你也只创建了1个线程。如果你创建了多个线程,你可能会想要在创建的线程的main中做一个pthread_join。如果在线程之前主要退出(很可能),我很确定其他线程死亡。 – Vitali 2009-09-29 03:03:28
我认为这一点很好,但。 – 2009-09-29 11:49:10
其中的线程调度运行的顺序取决于几件事情:
- 线程优先级
- 计划策略
-
任务属性。
在单个CPU上,除非某个线程被阻塞(例如因为等待I/O),否则创建多个线程将不会使程序运行得更快。相反,由于任务切换的开销,它可能会使程序变慢。
并且还注意到concurrency and parallelism之间的差异。
握住锁尽可能小的操作。如果你不这样做,那么线程的执行顺序退化为一个连续的任务(线程N执行并锁定资源,现在线程N必须在其他线程恢复工作之前完成,线程N完成并且线程N + 1执行,承担锁定,等等......)。也尝试用计算来交织内存I/O访问(我任意假定的是锁的保护),以实现更高程度的并行性。
什么是锁保护? – 2009-09-29 03:03:08
记住,如果你使用一个CPU /核心,那么你永远不会得到并行处理。它看起来像是如果你做得很好。 – eaanon01 2009-09-29 11:22:30