我有N个线程,他们必须在共享数据上做好工作。
我使用以下结构:
int main(){
pthread_create(..., func, ...);
}
void *func(void *id){
lock;
do_job;
unlock;
}
我的问题是线程似乎顺序工作。如何让它们平行?
答案 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