我正在尝试使用pthreads并行化操作。该过程看起来像:
double* doSomething( .... ) {
double* foo;
foo = new double[220];
for(i = 0; i<20; i++)
{
//do something with the elements in foo located between 10*i and 10*(i+2)
}
return foo;
}
for循环中发生的事情可以按任何顺序完成,所以我想用线程来组织它。
例如,我可以使用多个线程,使得每个线程遍历for循环的部分,但是在数组的不同部分上工作。为避免在处理重叠部件时出现问题,我需要锁定一些内存。
如何制作仅锁定部分数组的互斥锁(或其他东西)?
答案 0 :(得分:1)
如果您使用的是最新的gcc,可以尝试标准算法的并行版本。请参阅the libstdc++ parallel mode。
答案 1 :(得分:1)
如果你只是想确保数组的一部分工作一次......
创建一个全局变量:
int _iNextSection;
每当线程准备好对一个节进行操作时,该线程就会以这种方式获取下一个可用节:
iMySection = __sync_fetch_and_add(&_iNextSection, 1);
__sync_fetch_and_add()返回_iNextSection的当前值,然后递增_iNextSection。 __sync_fetch_and_add()是原子的,这意味着__sync_fetch_and_add()保证在另一个线程可以完成之前完成。没有锁定,没有阻塞,简单,快速。
答案 2 :(得分:0)
如果循环看起来和你写的完全一样,我会使用一个21个互斥量的数组,并在循环开始时第i(1 + 1)个互斥锁上的每个线程中阻塞。
类似于:
...
for (i = 0; i < 20; i++) {
mutex[i].lock();
mutex[i+1].lock();
...
mutex[i+1].unlock();
mutex[i].unlock();
}
逻辑是只有两个相邻的循环执行可以访问相同的数据(如果限制是[i * 10,(i + 2)* 10)),所以你只需要担心它们。