当前位置: 首页 > news >正文

网站建设平台讯息天津住建网官网

网站建设平台讯息,天津住建网官网,深圳网站优化排名,网站开发什么语言与互斥锁相关API 互斥量#xff08;mutex#xff09;从本质上来说是一把锁#xff0c;在访问共享资源前对互斥量进行加锁#xff0c;在访问完成后释放互斥量上的锁。对互斥量进行加锁后#xff0c;任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互…与互斥锁相关API       互斥量mutex从本质上来说是一把锁在访问共享资源前对互斥量进行加锁在访问完成后释放互斥量上的锁。对互斥量进行加锁后任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞所有在该互斥锁上的阻塞线程都会变成可运行状态第一个变为可运行状态的线程可以对互斥量加锁其他线程将会看到互斥锁依然被锁住只能回去等待它重新变为可用。在这种方式下每次只有一个线程可以向前运行。 在设计时需要规定所有的线程必须遵守相同的数据访问规则。只有这样互斥机制才能正常工作。操作系统并不会做数据访问的串行化。如果允许其中的某个线程在没有得到锁的情况下也可以访问共享资源那么即使其它的线程在使用共享资源前都获取了锁也还是会出现数据不一致的问题。 互斥变量用pthread_mutex_t数据类型表示。在使用互斥变量前必须对它进行初始化可以把它置为常量PTHREAD_MUTEX_INITIALIZER只对静态分配的互斥量也可以通过调用pthread_mutex_init函数进行初始化。如果动态地分配互斥量例如通过调用malloc函数那么在释放内存前需要调用pthread_mutex_destroy。 1. 创建及销毁互斥锁 #include pthread.h int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); int pthread_mutex_destroy(pthread_mutex_t *restrict mutex); // 返回若成功返回0否则返回错误编号要用默认的属性初始化互斥量只需把attr设置为NULL。 2. 加锁及解锁 #include pthread.h int pthread_mutex_lock(pthread_mutex_t *restrict mutex); int pthread_mutex_trylock(pthread_mutex_t mutex); int pthread_mutex_unlock(pthread_mutex_t *restrict mutex); // 返回若成功返回0否则返回错误编号如果线程不希望被阻塞它可以使用pthread_mutex_trylock尝试对互斥量进行加锁。如果调用pthread_mutex_trylock时互斥量处于未锁住状态那么pthread_mutex_trylock将锁住互斥量不会出现阻塞并返回0否则pthread_mutex_trylock就会失败不能锁住互斥量而返回EBUSY。 代码示例 #includestdio.h #includepthread.h //int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);int g_data0; pthread_mutex_t mutex;//定义一个互斥量也就是锁void*func1(void *arg) {int i;pthread_mutex_lock(mutex);//给互斥量上锁for(i0;i5;i){printf(t1 :%ld thread is created\n,(unsigned long)pthread_self());printf(t1:param is %d\n,*((int*)arg));}pthread_mutex_unlock(mutex);//给互斥量解锁}void*func2(void *arg) {pthread_mutex_lock(mutex);//给互斥量上锁printf(t2 :%ld thread is created\n,(unsigned long)pthread_self());printf(t2:param is %d\n,*((int*)arg));pthread_mutex_unlock(mutex);//给互斥量解锁}int main() {int ret;int param100;pthread_t t1;pthread_t t2;pthread_mutex_init(mutex,NULL);//初始化互斥量retpthread_create(t1,NULL,func1,(void*)param);if(ret0){printf(main:create t1 success\n);}retpthread_create(t2,NULL,func2,(void*)param);if(ret0){printf(main:create t2 success\n);}printf(main : %ld \n,(unsigned long)pthread_self());pthread_join(t1,NULL);//用来等待进程t1退出pthread_join(t2,NULL);//用来等待进程t2退出pthread_mutex_destroy(mutex);//销毁这把锁return 0; } 脚本可以这样写 CLCEmbed_Learn:~/xiancheng$ vi test.sh CLCEmbed_Learn:~/xiancheng$ chmod x test.sh CLCEmbed_Learn:~/xiancheng$ ./test.sh //其中test.sh中写入要运行的程序实现进程t1满足条件退出代码 #includestdio.h #includepthread.h #include stdlib.h //int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);int g_data0;//pthread_mutex_t mutex;void*func1(void *arg) {printf(t1 :%ld thread is created\n,(unsigned long)pthread_self());printf(t1:param is %d\n,*((int*)arg));pthread_mutex_lock(mutex);while(1){printf(t1 printf is %d\n,g_data);sleep(1);if(g_data3){pthread_mutex_unlock(mutex);printf(t1 over\n);//pthread_exit(NULL);exit(0);}}}void*func2(void *arg) {printf(t2 :%ld thread is created\n,(unsigned long)pthread_self());printf(t2:param is %d\n,*((int*)arg));while(1){printf(t2 printf is %d\n,g_data);pthread_mutex_lock(mutex);g_data; pthread_mutex_unlock(mutex);sleep(1);}pthread_mutex_unlock(mutex); }int main() {int ret;int param100;pthread_t t1;pthread_t t2;pthread_mutex_init(mutex,NULL);retpthread_create(t1,NULL,func1,(void*)param);if(ret0){printf(main:create t1 success\n);}retpthread_create(t2,NULL,func2,(void*)param);if(ret0){printf(main:create t2 success\n);}printf(main : %ld \n,(unsigned long)pthread_self());while(1){printf(main printf is %d\n,g_data);sleep(1);}pthread_join(t1,NULL);pthread_join(t2,NULL);pthread_mutex_destory(mutex);return 0; }什么情况下造成死锁       死锁 是指两个或两个以上的进程在执行过程中由于竞争资源或彼此通信而造成的一种阻塞现象无外力作用他们都将无法再推进下去。一般需要两个mutex 代码示例 void*func1(void *arg) {int i;pthread_mutex_lock(mutex);sleep(1);pthread_mutex_lock(mutex2);for(i0;i5;i){printf(t1 :%ld thread is created\n,(unsigned long)pthread_self());printf(t1:param is %d\n,*((int*)arg));}pthread_mutex_unlock(mutex);}void*func2(void *arg) {pthread_mutex_lock(mutex2);sleep(1);pthread_mutex_lock(mutex);printf(t2 :%ld thread is created\n,(unsigned long)pthread_self());printf(t2:param is %d\n,*((int*)arg));pthread_mutex_unlock(mutex);}参考博文https://www.cnblogs.com/xiehongfeng100/p/4620852.html
http://www.zqtcl.cn/news/969694/

相关文章:

  • 网站建设 有道翻译织梦修改网站后备份
  • 苏州网联盛网站建设做最好的在线看片网站
  • 一个空间怎么放2个网站陕西城乡住房建设部网站
  • 如何购买虚拟主机做网站企业查名
  • 动易网站默认密码网站怎么做 吸引人
  • 站长工具国产2023二级建造师证书查询官方网站
  • 微信小程序联盟网站北京网站建设华大
  • 人事怎么做招聘网站比对分析crm管理系统 一般包含
  • 林业网站建设有哪些北京微信小程序开发
  • ppt素材网站建设流程图网站开发原型工具
  • 乡镇医院网站建设成都市企业网站建设
  • 网站编辑如何做原创网站中英切换实例
  • 哈尔滨道外区建设局官方网站wordpress简称
  • 教师网站建设企业实践总结华为应用商店下载安装
  • 常见的网站空间服务商资阳建设局网站
  • 惠通网站建设湖南seo优化服务
  • 网站建设价格标准wordpress花钱吗
  • 龙门惠州网站建设苏州公司注册查询
  • 城阳网站设计自建网站与平台建站
  • 网站建设文字教程wordpress xml生成
  • wordpress修改注册表广西seo网站
  • 新兴网站建设招商网站建设多少钱
  • 商城网站页面模板网页设计的首页如何设计官网
  • 我的世界做外国壁纸网站嘉兴推广公司
  • 网站制作在哪里找怎样上传wordpress模板
  • 网站设计时尚博业建站网
  • 网站建设前期如何规划免费的源代码分享有哪些网站
  • 长春网络培训seo
  • 江苏网站开发建设电话公司网站需求说明书
  • 河北建设厅网站首页个人或主题网站建设实验体会