我正在专门学习pthreads
和mutex variables
。我正在看一个示例代码,您可以找到here。它使用线程来计算点积。该代码的中心部分是点积函数:
void *dotprod(void *arg)
{
int i,start,end,len ;
long offset;
double mysum,*x,*y;
offset = (long)arg;
len = dotstr.veclen;
start = offset*len;
end = start + len;
x = dotstr.a;
y = dotstr.b;
mysum = 0;
for (i=start; i<end ; i++)
{
mysum += (x[i] * y[i]);
}
/*
Lock a mutex prior to updating the value in the shared
structure,and unlock it upon updating.
*/
pthread_mutex_lock (&mutexsum);
dotstr.sum += mysum;
pthread_mutex_unlock (&mutexsum);
pthread_exit((void*) 0);
}
第一个问题是,是否确实需要在此处锁定线程。我尝试删除锁定和解锁呼叫,但最终结果是相同的。但是,这只是一个示例,因此在实践中也许不需要锁。这带给我第二个问题:我想我会尝试将代码更改为某些输出可能会更改的代码,具体取决于是否有多个线程正在访问dotstr.sum
。我再次摆脱了锁并尝试:
dotstr.sum += mysum;
dotstr.sum *= 1.1;
但与我的预期相反,这没有引入比赛条件。在几次试验中,输出完全相同。为什么会这样呢?最后,有人可以建议对代码进行简单的修改,以防需要锁定吗?