如何在C pthreads中并行化线程

时间:2009-09-29 02:56:46

标签: c multithreading

我有N个线程,他们必须在共享数据上做好工作。

我使用以下结构:

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

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

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

4 个答案:

答案 0 :(得分: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;
}

技巧(因为它在任何线程化或以其他方式并行化)正在找出你需要序列化的地方,以免破坏事物。这很容易。

答案 1 :(得分:0)

计划运行哪个线程的顺序取决于几个方面:

  • 主题优先级
  • 日程安排政策
  • 任务归因。

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

并注意concurrency and parallelism之间的区别。

答案 2 :(得分:0)

按住锁定尽可能小的操作。如果不这样做,则线程的执行顺序退化为顺序任务(线程N执行并锁定资源,现在线程N必须在任何其他线程恢复工作之前完成,线程N完成并且线程N + 1执行,假设锁定,等等......)。还尝试通过计算交错存储器I / O访问(我任意假设是锁保护的),以实现更高程度的并行性。

答案 3 :(得分:0)

尽可能使用read/write locks