Threads and Locking
题目来源Threads and Locking
本次作业主要讲的是并行作业,以及并行作业中互斥锁(P,V问题)的相关知识。
1 | gcc -g -O2 ph.c -pthread |
- 代码首先创建了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
。
在第二阶段,每个线程从散列表中获取NKEYS
。completion time
告诉你应用程序的总运行时间。
ph.c
程序主要工作是使用随机数生成10000个keys
,然后利用线性hash
将其插入5个哈希槽中,最后再取出每
个key。
2)pthread_mutex_t bucket_locks[NBUCKET];//声明锁变量数组:
3)在main()函数中初始锁变量数组
1 | for(i=0;i < NBUCKET;i++){ |
4)修改put函数
1 | static void put(int key, int value) |
5)再次编译ph.c,并分别以单线程和双线程运行,查看结果
gcc -g -O2 ph.c -pthread
0 keys missing
结果可能存在偏差。
这篇文章讲的更详细