互斥量(对数据结构保护)
来源:互联网 发布:帝国小说cms源码下载 编辑:程序博客网 时间:2024/05/17 23:00
#include<stdio.h>#include<stdlib.h>#include<pthread.h>/* * 当一个以上的线程需要访问动态分配的内存时,可以引入计数变量 */struct foo{ int f_count; pthread_mutex_t f_lock; int f_id;};struct foo* foo_alloc(int id)//allocate the object{ struct foo* fp; if((fp = (struct foo*)malloc(sizeof(struct foo))) != NULL) { fp->f_id = id; fp->f_count = 1;//引用计数加 1 if(pthread_mutex_init(&fp->f_lock, NULL) != 0) { free(fp); return NULL; } } return fp;}/* * 功能:增加一个引用 * 返回:无 */void foo_hold(struct foo *fp){ pthread_mutex_lock(&fp->f_lock); fp->f_count++; pthread_mutex_unlock(&fp->f_lock);}/* * 功能:销毁结构体 */void foo_rele(struct foo *fp){ //操作结构体之前锁住互斥量 pthread_mutex_lock(&fp->f_lock); if(--fp->f_count == 0)//是最后的引用 { pthread_mutex_unlock(&fp->f_lock); pthread_mutex_destroy(&fp->f_lock); free(fp); } else pthread_mutex_unlock(&fp->f_lock);}void printfoo(char *str, struct foo *fp){ printf("%s", str); printf("f_count = %d\n", fp->f_count); printf("f_id = %d\n", fp->f_id);}/* * 功能:线程函数 */void* thread_func(void *arg){ struct foo *fp = (struct foo*)arg; foo_hold(fp); fp->f_id = 2; foo_rele(fp); pthread_exit(NULL);}int main(void){ int err; struct foo *fp; pthread_t thid; if((fp = foo_alloc(1)) == NULL) { printf("foo_alloc failed\n"); exit(EXIT_FAILURE); } else printf("foo_alloc success\n"); printfoo("main thread\n", fp); err = pthread_create(&thid, NULL, thread_func, (void*)fp); if(err != 0) { printf("thread_create failed\n"); exit(EXIT_FAILURE); } err = pthread_join(thid, NULL); if(err != 0) { printf("pthread_join failed\n"); exit(EXIT_FAILURE); } printfoo("after thread:\n", fp); foo_rele(fp); return 0;}
阅读全文
0 0
- 互斥量(对数据结构保护)
- linux中利用互斥量对数据结构进行保护的源代码
- Unix使用互斥量保护数据结构
- 使用Monitor对资源进行保护(一)
- 使用Monitor对资源进行保护(二)
- 如何对颈椎进行保护.
- 对instance soft_delete的保护
- 【数据结构】(树套树)BZOJ3295动态逆序对
- (转载) 我对保护模式下CPL,DPL,RPL 的理解
- 第十二周项目1-3-长颈鹿类对动物类的继承(保护继承)
- 用Session对Web页面进行保护
- 对Linux服务器平台如何安全保护
- 对Linux服务器平台如何安全保护
- 电脑对人体的伤害:分析、保护
- 用Session对Web页面进行保护
- dotNet加密锁(对.NET加密保护)
- dotNet加密锁(对.NET加密保护)
- dotNet加密锁(对.NET加密保护)
- 如何对文本框进行功能测试
- User doesn't sign in. leancloud
- 从新建vue项目到引入组件Element流程
- MySql 5.7.13 for Mac 密码重置教程(适合忘记密码)
- UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数
- 互斥量(对数据结构保护)
- PHP中获取当前页面的URL+tar压缩/解压+centos7修改中文字符集
- JS利用参数个数实现重载
- 【Unity3d】界面管理工具UIPanelController方案
- 阿里云免费SSL证书应该如何申请?
- 测试人员的考核评定
- 九度[1004]-Median
- Qlabel
- Android设计模式之(18)----适配器模式