0%

Thread and locking

Threads and Locking

题目来源Threads and Locking
本次作业主要讲的是并行作业,以及并行作业中互斥锁(P,V问题)的相关知识。

ph.c源码

1
2
3
gcc -g -O2 ph.c -pthread
./a.out 1
./a.out 2
  • 代码首先创建了10000个小的node,用每一个node(在代码中名字是entry)来表示一个线程(这里涉及C++链表的内容),然后通过平均分配的方法来把这些线程分配给各个进程。
  • put函数用来将每一个线程加入链表。然后将这个node的对应信息记录到哈希表:struct entry *table[NBUCKET]中。
  • get函数通过反哈希的方式得到一个node(也就是一个线程)。同时这也表示这次线程的结束。

这样不断通过put 和get来实现并行程序。

产生错误的原因:当我们在使用put函数的时候,不小心造成两个新的node同时插入链表时(也就是同时使用内存),我们的哈希表只能记录下其中的一个表头,而失去了另外一个node的表头,所以造成了get的时候丢失了node。

为了避免这样的错误产生,我们仅仅需要在put的时候加入互斥锁即可:

1)编译ph.c源文件,并分别以单线程和双线程运行,查看结果

每个线程分两个阶段(phases)运行。在第一个阶段,每个线程将NKEYS/nthread keys放入the hash table
在第二阶段,每个线程从散列表中获取NKEYSprint语句告诉你每个阶段为每个线程花费了多长时间。 倒数第二行会告诉你有多少个key丢失了,底部的completion time告诉你应用程序的总运行时间。

ph.c程序主要工作是使用随机数生成10000个keys,然后利用线性hash将其插入5个哈希槽中,最后再取出每
个key。

2)pthread_mutex_t bucket_locks[NBUCKET];//声明锁变量数组:

3)在main()函数中初始锁变量数组

1
2
3
  for(i=0;i < NBUCKET;i++){
pthread_mutex_init(&bucket_locks[i],NULL);
}

4)修改put函数

1
2
3
4
5
6
7
8
9
10
11
static void put(int key, int value)

{

int i = key % NBUCKET;

pthread_mutex_lock(&bucket_locks[i]);
insert(key, value, &table[i], table[i]);
pthread_mutex_unlock(&bucket_locks[i]);

}

5)再次编译ph.c,并分别以单线程和双线程运行,查看结果
gcc -g -O2 ph.c -pthread

0 keys missing
结果可能存在偏差。
这篇文章讲的更详细

Thank you for your support