我是多线程编程的新手,我对于声明互斥锁的位置感到困惑。我通过谷歌搜索得到了互斥锁,锁定/解锁的想法。但我仍然不知道我需要在哪里声明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);
}
有谁能告诉我这两种情况之间的区别是什么?为什么我需要以这种方式声明互斥?
答案 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}'
上的一致结果(在您的示例中缺失),互斥体用于同步对它们的访问。因此,互斥体在与变量相同的上下文中声明。