2009-09-29 33 views
1

我有N个线程,他们必须在共享数据上完成任务。如何在C pthreads中并行化线程

我使用的结构如下:

int main(){ 
    pthread_create(..., func, ...); 
} 

void *func(void *id){ 
    lock; 
    do_job; 
    unlock; 
} 

我的问题是,线程似乎顺序工作。如何让他们平行?

+0

什么是锁保护? – 2009-09-29 03:03:08

+1

记住,如果你使用一个CPU /核心,那么你永远不会得到并行处理。它看起来像是如果你做得很好。 – eaanon01 2009-09-29 11:22:30

回答

6

他们正在序列化,因为你在整个操作中持有锁。要真正获得并行你需要做这样的事情:

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; 
} 

诀窍(因为它是在什么线程或其他并行化)正在抓紧你需要为了不打破东西连载。这是不是容易。

+0

在你的例子中,你也只创建了1个线程。如果你创建了多个线程,你可能会想要在创建的线程的main中做一个pthread_join。如果在线程之前主要退出(很可能),我很确定其他线程死亡。 – Vitali 2009-09-29 03:03:28

+0

我认为这一点很好,但。 – 2009-09-29 11:49:10

0

其中的线程调度运行的顺序取决于几件事情:

  • 线程优先级
  • 计划策略
  • 任务属性。

    在单个CPU上,除非某个线程被阻塞(例如因为等待I/O),否则创建多个线程将不会使程序运行得更快。相反,由于任务切换的开销,它可能会使程序变慢。

并且还注意到concurrency and parallelism之间的差异。

0

握住锁尽可能小的操作。如果你不这样做,那么线程的执行顺序退化为一个连续的任务(线程N执行并锁定资源,现在线程N必须在其他线程恢复工作之前完成,线程N完成并且线程N + 1执行,承担锁定,等等......)。也尝试用计算来交织内存I/O访问(我任意假定的是锁的保护),以实现更高程度的并行性。