在多线程程序中定义互斥锁的位置和区别

时间:2015-12-15 02:44:18

标签: c multithreading mutex

我是多线程编程的新手,我对于声明互斥锁的位置感到困惑。我通过谷歌搜索得到了互斥锁,锁定/解锁的想法。但我仍然不知道我需要在哪里声明pthread_mutex_t变量,有什么区别。

例如,案例1:

#include <pthread.h>

pthread_mutex_t count_mutex;
long long count;

void
increment_count()
{
        pthread_mutex_lock(&count_mutex);
    count = count + 1;
        pthread_mutex_unlock(&count_mutex);
}

以下是案例2:

struct order_que
{
struct order **orders;
int size;
int head;
int tail;
pthread_mutex_t lock;
};

void *ClientThread(void *arg)
{
struct client_arg *ca = (struct client_arg *)arg;
int i;
for(i=0; i < ca->order_count; i++) {
    ......
    queued = 0;
    while(queued == 0) {
        pthread_mutex_lock(&(ca->order_que->lock));
        ......
        if(next == ca->order_que->tail) {
            pthread_mutex_unlock(&(ca->order_que->lock));
            continue;
        }
        ......
        pthread_mutex_unlock(&(ca->order_que->lock));
        ......
    }
}
return(NULL);
}

有谁能告诉我这两种情况之间的区别是什么?为什么我需要以这种方式声明互斥?

1 个答案:

答案 0 :(得分:0)

  

有谁能告诉我这两种情况之间的区别是什么?为什么我需要以这种方式声明互斥?

一般来说,互斥锁的设计目标是synchronize accesses(防止race conditions)到资源。因此,互斥声明通常跟随声明要保护的资源的声明。

在#1的情况下,互斥锁同步访问全局变量count - 因此它与变量一起被全局声明。它保证,当在不同线程的不同CPU上调用increment_count()时,count变量上的非原子算术将以一致的方式执行,从而产生预期结果。

在#2情况下,互斥锁同步访问order_que ring buffer,显然可以从多个线程访问。head {{3}}。 (似乎是作业队列的代码:items / jobs / etc的队列,线程应该并行处理。)通用环形缓冲区需要tail上的算术和head指针排队和出列物品。为了保证算术在tail / SELECT SUM(Orders) AS TotalOrders FROM ORDERS WHERE ORDER_DATE >= '{?StartDate}' AND ORDER_DATE <='{?EndDate}' 上的一致结果(在您的示例中缺失),互斥体用于同步对它们的访问。因此,互斥体在与变量相同的上下文中声明。