1

我需要调用一个返回唯一ID的函数,

int getid()
{
static id=0;
id++;
return id;

}

多个线程需要调用这个函数,我的问题是我不确定我需要在哪里锁定互斥体,

在调用如下函数之前和之后是否需要锁定

  pthread_mutex_lock( &id );
  int id = getid()
  pthread_mutex_unlock( &id );

有人可以帮我吗?

4

2 回答 2

3

只要在访问共享状态之前,它被锁定在哪里并不重要。如果互斥锁在函数内部,则不太容易出错。像这样最小的东西会起作用:

int getid()
{
static int id=0;

pthread_mutex_lock( &mutex );
int newId = ++id;
pthread_mutex_unlock( &mutex );

return newId; 
}

静态变量的初始化存在一些线程安全的问题,您可能需要研究这些问题。

于 2012-11-18T01:47:18.680 回答
2

对于单个整数,您不需要完整的互斥锁,原子增量就足够了:

int getid() {
    static int id = 0;
    return __sync_fetch_and_add( &id, 1 );
}
于 2012-11-18T01:56:44.233 回答