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

天津网站建设服务前端性能优化有哪些方法

天津网站建设服务,前端性能优化有哪些方法,可以做网站的渠道,wordpress首页加登录类似与进程间通信信号量的加锁解锁。 对互斥量进行加锁后,任何其他试图在此对互斥量加锁的线程都会被阻塞,直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程被阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变…

类似与进程间通信信号量的加锁解锁。

对互斥量进行加锁后,任何其他试图在此对互斥量加锁的线程都会被阻塞,直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程被阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为可运行状态的线程可以对互斥量加锁,其他线程将会看到互斥量依旧被锁住,只能回去等待它重新变为可用。在这种方式下,每次只有一个线程可以向前运行。

在设计时需要规定所有的线程必须遵守相同的数据访问规则,只有这样,互斥机制才能正常工作。如果允许其中的某个线程在没有得到锁的情况下也可以访问共享资源,那么即使其他的线程在使用共享资源前都获取了锁,也还是会出现数据不一致的问题。

互斥变量用pthread_mutex_t数据类型表示。在使用互斥变量前必须对它进行初始化,可以把它置为常量。

PTREAD_MUTEX-INITIALIZWE(只对静态分配的互斥量),也可以通过调用pthread_mutex_init函数对其进行初始化。如果动态的分配互斥量(例如调用malloc),那么在释放内存前需要调用pthread_mutex_destory。

创建互斥锁

函数原型

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);

参数

pthread_mutex_t *restrict mutex:锁的地址。

onst pthread_mutexattr_t *restrict attr:锁的属性,可以是NULL,默认属性创建锁

返回值

若成功返回0,否则返回错误编号

销毁互斥锁

函数原型

int pthread_mutex_destroy(pthread_mutex_t *mutex);

参数

pthread_mutex_t *mutex:锁的地址。

返回值

若成功返回0,否则返回错误编号

加锁、解锁

函数原型:

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);

返回值:

若成功返回0,否则返回错误编号

  如果线程不希望被阻塞,它可以使用pthread_mutex_trylock尝试对互斥量进行加锁。如果调用pthread_mutex_trylock时互斥量处于未锁住状态,那么pthread_mutex_trylock将锁住互斥量,不会出现阻塞并返回0,否则pthread_mutex_trylock就会失败,不能锁住互斥量,而返回EBUSY。

示例1:

在前面一节,提出了一个问题,怎么保证t1线程先运行,我们可以把g_data作为一个互斥量,对它进行加锁、解锁就可以实现。

#include <stdio.h>
#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 *mutex);
//int pthread_mutex_lock(pthread_mutex_t *mutex);
//int pthread_mutex_trylock(pthread_mutex_t *mutex);
//int pthread_mutex_unlock(pthread_mutex_t *mutex);
int g_data=0;pthread_mutex_t mutex;void *func1(void *arg)
{int i;pthread_mutex_lock(&mutex);for(i=0;i<3;i++){printf("t1:%ld thread is creart\n",(unsigned long)pthread_self());printf("t1:param is %d\n",*((int *)arg));sleep(1);}pthread_mutex_unlock(&mutex);
}void *func2(void *arg)
{pthread_mutex_lock(&mutex);printf("t2:%ld thread is creart\n",(unsigned long)pthread_self());printf("t2:param is %d\n",*((int *)arg));pthread_mutex_unlock(&mutex);
}int main()
{int param=100;char *pret=NULL;int ret1;int ret2; pthread_t t1;pthread_t t2;pthread_mutex_init(&mutex,NULL);ret1=pthread_create(&t1, NULL,func1, (void *)&param);ret2=pthread_create(&t1, NULL,func2, (void *)&param);if(ret1 == 0){printf("main:create t1 successed\n");}if(ret2 == 0){printf("main:create t2 successed\n");}printf("main:%ld\n",(unsigned long)pthread_self());pthread_join(t1,NULL);printf("main: t1 quit:%s\n",pret);pthread_join(t2,NULL);printf("main: t2 quit:%s\n",pret);pthread_mutex_destroy(&mutex);return 0;
}

上面代码运行的结果来看,无论运行多少次代码,都是t1线程运行完毕后,t2线程才运行。main函数不在t1后运行的原因时,main线程并没有参与互斥锁的加锁解锁。

示例2:互斥锁限制共享资源的访问

前面一节还提到了一个问题,如何保证g_data=3 时 t1 线程退出

#include <stdio.h>
#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 mutex);
//int pthread_mutex_lock(pthread_mutex_t mutex);
//int pthread_mutex_trylock(pthread_mutex_t mutex);
//int pthread_mutex_unlock(pthread_mutex_t mutex);int g_data=0;void *func1(void *arg)
{printf("t1:%ld thread is creart\n",(unsigned long)pthread_self());printf("t1:param is %d\n",*((int *)arg));pthread_mutex_lock(&mutex);while(1){printf("t1:%d\n",g_data++);sleep(1);if(g_data==3){printf("==================\n");pthread_mutex_unlock(&mutex);pthread_exit(NULL);}}}void *func2(void *arg)
{printf("t2:%ld thread is creart\n",(unsigned long)pthread_self());printf("t2:param is %d\n",*((int *)arg));while(1){printf("t2:%d\n",g_data);pthread_mutex_lock(&mutex);g_data++;pthread_mutex_unlock(&mutex);sleep(1);}
}int main()
{int param=100;char *pret=NULL;int ret1;int ret2;pthread_t t1;pthread_t t2;pthread_mutex_init(&mutex,NULL);ret1=pthread_create(&t1, NULL,func1, (void *)&param);ret2=pthread_create(&t1, NULL,func2, (void *)&param);if(ret1 == 0){printf("main:create t1 successed\n");}if(ret2 == 0){printf("main:create t2 successed\n");}printf("main:%ld\n",(unsigned long)pthread_self());while(1){printf("main:%d\n",g_data);sleep(1);}pthread_join(t1,NULL);pthread_join(t2,NULL);pthread_mutex_destroy(&mutex);return 0;
}

因为在g_data到达3之前,t1至少会被运行一次,所以可以运行t1时加锁,直到g_data=3,t1退出在解锁就可以实现。可以看到以上戴拿运行情况,只要运行到t1线程,g_data=3时就退出,再去运行t2和main。

http://www.hkea.cn/news/144579/

相关文章:

  • 道里网站运营培训北京网络营销咨询公司
  • 目前做网站流行的语言seo关键词排名优化哪家好
  • 长沙营销型网站制作费用seo图片优化
  • 学生诚信档案建设网站seo数据分析
  • 北京住房城乡建设厅网站首页1688官网入口
  • 网站建设需要懂什么软件徐州百度seo排名优化
  • wordpress网站样式网站排名查询
  • 郑州网站建设推销外贸网站推广与优化
  • 当当网站开发系统说明搜索引擎排名google
  • 国外男女直接做的视频网站企业邮箱登录入口
  • 成都可以做网站的公司百度手机助手最新版下载
  • 赤峰网站建设招聘市场营销互联网营销
  • 网站开发后端需要哪些技术友情链接检索数据分析
  • 金华竞价排名 金华企业网站建设常见的网络营销平台有哪些
  • p2p网站开发关键词seo是什么意思
  • 自己免费怎么制作网站合肥今天的最新消息
  • 今日头条新闻10条简短seo网络优化招聘信息
  • 赣州人才网官方网站关键词seo优化软件
  • cad做兼职区哪个网站郑州网络营销公司排名
  • 宁夏银川做网站的公司有哪些网络营销分类
  • 换物网站为什么做不起来中国免费广告网
  • 可以显示一张图片的网站怎么搭建搜索引擎优化策略
  • 精品课程网站建设论文今天的新闻最新消息
  • 检查网站收录问题蚌埠seo外包
  • 建站展示网站优化网
  • 秦皇岛网站建设价格深圳seo公司
  • 广告型网站建设广州营销网站建设靠谱
  • 包头学做网站平台开发
  • 个人如何做微商城网站指数分布的分布函数
  • 北京网站设计哪家公司好建站工具