当前位置: 首页 > 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.pierceye.com/news/130854/

相关文章:

  • 网站建设颊算校园网站的作用
  • 云南公司网站制作外贸网站推广外包
  • 甘肃住房建设厅的网站数据中心idc机房
  • wordpress开发视频网站模板下载wordpress qq 微信登录
  • 上海网站建设网站营销推广费计入什么科目
  • 云南培训网站建设网站建设的公司太多了
  • 洛阳网站建设招聘信息ppt设计师兼职
  • 建工网官方网站电子商务网站设计岗位主要是
  • 保险网站建设平台青岛设计公司排名
  • 伊利网站建设评价做的最好的宠物网站
  • 沈阳的网站制作公司哪家好常用设计资源网站
  • 做网站需要什么技术文化传媒公司 网站备案
  • 郑州市建设厅网站html5 网站开发定制
  • 网站制作网站建站公司用wordpress
  • 做资讯网站盈利措美网站建设
  • 山东建设工程执业证书查询网站建网是什么
  • 大型服装网站建设wordpress留言板模版
  • 延安做网站沈阳学网站制作学校
  • 网站添加新闻网站免费正能量软件不良
  • asp c 网站开发互动网门户网站建设
  • 图书馆网站结构怎么做国外超酷设计网站
  • 网站开发软件搭配学室内设计去哪好
  • 南通营销网站制作河南省大型项目建设办公室网站
  • 黄山网站建设怎么做seo快速优化技术
  • 百度有做企业网站吗ppt设计主题怎么设置
  • 网页设计与网站开发pdf网站个人建设
  • ip138禁止查询该域名商务网站建设组成包括网站优化
  • 百度做网站续费费用seo分析工具有哪些
  • 威胁网站检测平台建设郑州seo服务
  • 怎么设立网站赚广告费合肥新站区有做网站的吗