Unix系统编程_cha11.6_线程同步
2016-03-27 20:32
375 查看
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#define NHASH 29
#define HASH(fp) (((unsigned long)fp)%NHASH)
struct foo *fh[NHASH];
pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER;
struct foo{
int f_count;
pthread_mutex_t f_lock;
struct foo *f_next;
int f_id;
};
struct foo *foo_alloc(void){
struct foo *fp;
int idx;
if((fp = malloc(sizeof(struct foo))) != NULL){
fp->f_count = 1;
if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
free(fp);
return (NULL);
}
idx = HASH(fp);
pthread_mutex_lock(&hashlock);
fp->f_next = fh[idx];
fh[idx] = fp->f_next;
pthread_mutex_lock(&fp->f_lock);
pthread_mutex_unlock(&hashlock);
// continue initialization
}
return (fp);
}
void foo_hold(struct foo *fp){
pthread_mutex_lock(&hashlock);
fp->f_count++;
pthread_mutex_unlock(&hashlock);
}
struct foo *foo_find(int id){
struct foo *fp;
int idx;
idx = HASH(fp);
pthread_mutex_lock(&hashlock);
for (fp = fh[idx]; fp != NULL; fp = fp->f_next ) {
if(fp->f_id == id){
fp->f_count++;
break;
}
}
pthread_mutex_unlock(&hashlock);
return (fp);
}
void foo_release(struct foo *fp){
struct foo *tfp;
int idx;
pthread_mutex_lock(&hashlock);
if(--fp->f_count == 0){
idx = HASH(fp);
tfp = fh[idx];
if(tfp == fp){
fh[idx] = fp->f_next;
}else {
while (tfp->f_next != fp)
tfp = tfp->f_next;
tfp->f_next = fp->f_next;
}
pthread_mutex_unlock(&hashlock);
pthread_mutex_destroy(&fp->f_lock);
free(fp);
}else {
pthread_mutex_unlock(&hashlock);
}
}
int main(void)
{
printf("Hello World!\n");
return 0;
}
#include <pthread.h>
#include <stdlib.h>
#define NHASH 29
#define HASH(fp) (((unsigned long)fp)%NHASH)
struct foo *fh[NHASH];
pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER;
struct foo{
int f_count;
pthread_mutex_t f_lock;
struct foo *f_next;
int f_id;
};
struct foo *foo_alloc(void){
struct foo *fp;
int idx;
if((fp = malloc(sizeof(struct foo))) != NULL){
fp->f_count = 1;
if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
free(fp);
return (NULL);
}
idx = HASH(fp);
pthread_mutex_lock(&hashlock);
fp->f_next = fh[idx];
fh[idx] = fp->f_next;
pthread_mutex_lock(&fp->f_lock);
pthread_mutex_unlock(&hashlock);
// continue initialization
}
return (fp);
}
void foo_hold(struct foo *fp){
pthread_mutex_lock(&hashlock);
fp->f_count++;
pthread_mutex_unlock(&hashlock);
}
struct foo *foo_find(int id){
struct foo *fp;
int idx;
idx = HASH(fp);
pthread_mutex_lock(&hashlock);
for (fp = fh[idx]; fp != NULL; fp = fp->f_next ) {
if(fp->f_id == id){
fp->f_count++;
break;
}
}
pthread_mutex_unlock(&hashlock);
return (fp);
}
void foo_release(struct foo *fp){
struct foo *tfp;
int idx;
pthread_mutex_lock(&hashlock);
if(--fp->f_count == 0){
idx = HASH(fp);
tfp = fh[idx];
if(tfp == fp){
fh[idx] = fp->f_next;
}else {
while (tfp->f_next != fp)
tfp = tfp->f_next;
tfp->f_next = fp->f_next;
}
pthread_mutex_unlock(&hashlock);
pthread_mutex_destroy(&fp->f_lock);
free(fp);
}else {
pthread_mutex_unlock(&hashlock);
}
}
int main(void)
{
printf("Hello World!\n");
return 0;
}
相关文章推荐
- PHP建立和删除目录
- base64编码、解码的C语言实现
- C语言的EOF
- qt c++对象头文件如何相互包含
- GB/T2659-2000《世界各国和地区名称代码》
- PHP7 错误处理
- Leetcode 2. Add Two Numbers(python)
- PyQt4程序图标
- 浅谈const限定符——c++
- jvm(6)-java类文件结构(字节码文件)
- 20160327javaweb 之JSP入门
- C++游戏系列1-角色类
- 关于编程语言是否拥有自我完善功能的思考
- 共同学习Spring源码--开篇语
- JDK的安装
- C++项目参考解答:三角形类
- SpringMVC类型转换、数据绑定详解[附带源码分析]
- Google Test
- ASP.NET Web API 2 入门
- JAVA常用集合框架用法详解基础篇二之Colletion子接口List