Pthreads和互斥体;锁定数组的一部分

时间:2011-02-16 16:00:06

标签: c++ arrays pthreads mutex

我正在尝试使用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循环的部分,但是在数组的不同部分上工作。为避免在处理重叠部件时出现问题,我需要锁定一些内存。

如何制作仅锁定部分数组的互斥锁(或其他东西)?

3 个答案:

答案 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)),所以你只需要担心它们。