【问题标题】:How to parallelize threads in C pthreads如何在 C pthreads 中并行化线程
【发布时间】:2009-09-29 02:56:46
【问题描述】:

我有 N 个线程,它们必须处理共享数据。

我正在使用以下结构:

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

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

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

【问题讨论】:

  • 请记住,如果您使用一个 cpu/核心,那么您将永远无法获得并行处理。如果你做得对,它看起来就像它。

标签: c multithreading


【解决方案1】:

它们正在序列化,因为您在整个操作中都持有锁定。要真正获得并行性,您需要执行以下操作:

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。如果 main 在线程之前退出(很可能),我很确定其他线程都死了。
【解决方案2】:

保持锁定以进行尽可能小的操作。如果你不这样做,那么线程的执行顺序将退化为一个顺序任务(线程 N 执行并锁定资源,现在线程 N 必须在任何其他线程可以恢复工作之前完成,线程 N 完成并且线程 N+1 执行,假设锁定,等等..)。还可以尝试将内存 I/O 访问(我任意假设是锁所保护的内容)与计算交错,以实现更大程度的并行性。

【讨论】:

    【解决方案3】:

    尽可能使用read/write locks

    【讨论】:

      【解决方案4】:

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

      • 线程优先级
      • 日程安排政策
      • 任务归属。

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

      还要注意concurrency and parallelism之间的区别。

      【讨论】:

        猜你喜欢
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-18
        • 2021-03-03
        • 2016-08-06
        • 2012-07-05
        • 2023-03-17
        相关资源
        最近更新 更多