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

又一个wordpress站点怎么进怎么做ppt

又一个wordpress站点怎么进,怎么做ppt,专业的网页设计流程,成年做羞羞的视频网站space一、条件变量 【互斥量】解决了线程间同步的问题,避免了多线程对同一块临界资源访问产生的冲突,但同一时刻对临界资源的访问,不论是生产者还是消费者,都需要竞争互斥锁,由此也带来了竞争的问题。即生产者和消费者、消费…

一、条件变量

        【互斥量】解决了线程间同步的问题,避免了多线程对同一块临界资源访问产生的冲突,同一时刻对临界资源的访问,不论是生产者还是消费者,都需要竞争互斥锁,由此也带来了竞争的问题。即生产者和消费者、消费者和消费者之间时刻都在竞争这把锁,而临界资源是有限的,当临界资源为空候,消费者之间的竞争便没有意义,反而降低了运行效率。

        有没有什么办法可以等生产者线程生产出资源,消费者线程再去竞争锁消费呢?这就是条件变量的作用。

        正如互斥量保护了【临界资源】,条件变量也保护【条件】资源,当条件不符合时即【条件】资源空缺,消费者线程休眠等待;当【条件】资源产生,消费者线程被唤醒然后去消费资源。这样便解决了线程间等待的问题,提高了运行效率。

pthread_cond_t cond  //定义条件变量
pthread_cond_init(&cond) //动态初始化pthread_cond_t cond = PTHREAD_COND_INITIALIZER //静态创建并初始化/*消费者线程休眠等待生产者线程通知*/
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex)/*生产者线程生产完资源后发送通知*/
int pthread_cond_signal(pthread_cond_t *cond)    //唤醒一个休眠的线程
int pthread_cond_broadcast(pthread_cond_t *cond) //广播唤醒所有休眠的线程
  • 条件变量的使用要绑定互斥锁

    • 因为条件变量的使用过程中,对于生产者线程,需要产生资源当然要上锁;对于消费者线程,需要消费资源甚至还要判断资源是否为空,也要上锁

  • 【wait】函数的具体动作

    • 进入等待的线程列表中休眠并释放锁

    • 被唤醒后返回,同时上锁

wait函数的每个动作都是【原子操作】,动作连续并且不会被别的程序干扰,意味着CPU调度一定能保证动作粒一气呵成

         消费线程不判断资源是否为空直接等待的话容易丢失signal信号(假设生产线程提前生产出资源也signal了)

        唤醒也可以用broadcast,这种情况消费线程一定要判断资源是否为空,否则链表形式的资源容易出现【段错误】(因为多个线程去争抢资源时,总有抢不到的)

二、线程池 

若干线程的集合,可用结构体来构造

必要性:当会出现大量执行时间短的任务时,甚至这个时间比线程创建+销毁的时间还短,这时候再创建多个线程就不划算了,可以未雨绸缪,构建线程池,提前创建多个线程来节省开销

 线程池的实现过程

1.创建任务队列、线程池的结构体、定义一个线程池

#define pool_num (10)typedef struct Task{struct Task *next;void *(*func)(void *);void *arg;}Task;typedef struct{pthread_mutex_t mutex;pthread_cond_t cond;Task *task_head;int busywork;pthread_t tid[pool_num];}ThreadPool;ThreadPool *pool;

2.初始化线程池、线程的工作

void pool_init()
{pool = (ThreadPool *)malloc(sizeof(ThreadPool));pthread_mutex_init(&pool->mutex,NULL);pthread_cond_init(&pool->cond,NULL);pool->task_head = NULL;pool->busywork = 0;for(i=0;i<pool_num;i++){pthread_create(&pool->tid[i],NULL,workthread,NULL);}
}void *workthread(void *arg)
{while(1){	//	usleep(10000);  //avoid other process couldn't rob the lock and several process repeatedly rob the lockpthread_mutex_lock(&pool->mutex);while(pool->task_head == NULL){pthread_cond_wait(&pool->cond,&pool->mutex);}Task *ptask = pool->task_head;//任务取走线程池的头个线程pool->task_head = ptask->next;//重置线程池的头个线程为下一个pool->busywork--;//pthread_mutex_unlock(&pool->mutex);printf("%ld start task %d\n",pthread_self(),(int)ptask->arg);ptask->func(ptask->arg);}
}

3.添加任务

void *realwork(void *arg)
{usleep(100000);printf("finish task %d\n",(int)arg);}void add_task(int arg)
{pthread_mutex_lock(&pool->mutex);while(pool->busywork >= pool_num){pthread_mutex_unlock(&pool->mutex);usleep(10000);pthread_mutex_lock(&pool->mutex);}pthread_mutex_unlock(&pool->mutex);//以上为判断任务数量是否超过线程池数量,超过则不再允许添加任务Task *newtask;newtask = (Task *)malloc(sizeof(Task));newtask->func = realwork;newtask->arg = (void *)arg;pthread_mutex_lock(&pool->mutex);Task *p = pool->task_head;if(p == NULL){pool->task_head = newtask;}else{while(p->next != NULL){p = p->next;}p->next = newtask;pthread_cond_signal(&pool->cond);pool->busywork++;}pthread_mutex_unlock(&pool->mutex);
}	

4.销毁线程池、任务队列、互斥锁、条件变量

void pool_destroy()
{Task *p;while(pool->task_head != NULL){p = pool->task_head;pool->task_head = p->next;free(p);}pthread_mutex_destroy(&pool->mutex);pthread_cond_destroy(&pool->cond);free(pool);
}

示例

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>#define pool_num (10)
int i = 0;typedef struct Task{struct Task *next;void *(*func)(void *);void *arg;}Task;typedef struct{pthread_mutex_t mutex;pthread_cond_t cond;Task *task_head;int busywork;pthread_t tid[pool_num];}ThreadPool;ThreadPool *pool;void *workthread(void *arg)
{while(1){	//	usleep(10000);  //avoid other process couldn't rob the lock and several process repeatedly rob the lockpthread_mutex_lock(&pool->mutex);while(pool->task_head == NULL){pthread_cond_wait(&pool->cond,&pool->mutex);}Task *ptask = pool->task_head;//任务取走线程池的头个线程pool->task_head = ptask->next;//重置线程池的头个线程为下一个pool->busywork--;//pthread_mutex_unlock(&pool->mutex);printf("%ld start task %d\n",pthread_self(),(int)ptask->arg);ptask->func(ptask->arg);}
}void *realwork(void *arg)
{usleep(100000);printf("finish task %d\n",(int)arg);}void add_task(int arg)
{pthread_mutex_lock(&pool->mutex);while(pool->busywork >= pool_num){pthread_mutex_unlock(&pool->mutex);usleep(10000);pthread_mutex_lock(&pool->mutex);}pthread_mutex_unlock(&pool->mutex);Task *newtask;newtask = (Task *)malloc(sizeof(Task));newtask->func = realwork;newtask->arg = (void *)arg;pthread_mutex_lock(&pool->mutex);Task *p = pool->task_head;if(p == NULL){pool->task_head = newtask;}else{while(p->next != NULL){p = p->next;}p->next = newtask;pthread_cond_signal(&pool->cond);pool->busywork++;}pthread_mutex_unlock(&pool->mutex);
}	void pool_init()
{pool = (ThreadPool *)malloc(sizeof(ThreadPool));pthread_mutex_init(&pool->mutex,NULL);pthread_cond_init(&pool->cond,NULL);pool->task_head = NULL;pool->busywork = 0;for(i=0;i<pool_num;i++){pthread_create(&pool->tid[i],NULL,workthread,NULL);}}void pool_destroy()
{Task *p;while(pool->task_head != NULL){p = pool->task_head;pool->task_head = p->next;free(p);}pthread_mutex_destroy(&pool->mutex);pthread_cond_destroy(&pool->cond);free(pool);
}int main()
{printf("mypid is %d\n",getpid());pool_init();sleep(5);for(i=1;i<=40;i++){add_task(i);}sleep(5);pool_destroy();while(1){printf("now im alone\n");sleep(2);}	}

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

相关文章:

  • 一物一码二维码生成系统最好用的系统优化软件
  • 如何在大网站做外链镇江网站建站
  • 杭州网站建设公司导航短视频营销案例
  • 昆明做网站建设有哪些长尾关键词排名工具
  • 一女被多男做的视频网站网站seo系统
  • 网站建设 青海网站建设找哪家好
  • win7 网站配置优化方案官网电子版
  • 广州seo优化公司排名浙江seo博客
  • 全网推广的方式有哪些抖音seo推荐算法
  • 网站开发开源架构抖音营销软件
  • 自己做的网站能放到网上么青岛seo经理
  • 营业推广策划方案邵阳网站seo
  • 手机网站横向切换kol合作推广
  • 专门做超市海报的网站宁波seo咨询
  • 仿网站上的焦点图在线看seo网站
  • 做网站的业务员艾滋病阻断药有哪些
  • web集团网站建设广告投放平台有哪些
  • 大连做网站建设广告资源对接平台
  • 做网站怎么写工作日志泉州网站seo公司
  • wordpress外链站内打开搜索引擎是什么意思啊
  • 做论坛网站需要什么备案新站seo优化快速上排名
  • 动漫网站html百度网盘搜索
  • 怎么看一个网站什么语言做的宝鸡seo培训
  • 数据库网站建设公司他达拉非片
  • 英文商城网站建设搜索引擎营销的特点
  • 易优建站系统图片百度搜索
  • 网站开发不用框架web网站设计
  • 技能网站建设项目需求武汉网络推广外包公司
  • 安卓市场下载手机版优化网站排名技巧
  • 建设网站平台哪个好互联网营销外包推广