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

吉林市网站建设搜索引擎外部优化有哪些渠道

吉林市网站建设,搜索引擎外部优化有哪些渠道,二级域名大全,夏都通app下载最新版本线程间同步 在多线程实时系统中,一项工作的完成往往可以通过多个线程协调的方式共同来完成,那么多个线程之间如何 “默契” 协作才能使这项工作无差错执行?下面举个例子说明。 例如一项工作中的两个线程:一个线程从传感器中接收…

线程间同步

在多线程实时系统中,一项工作的完成往往可以通过多个线程协调的方式共同来完成,那么多个线程之间如何 “默契” 协作才能使这项工作无差错执行?下面举个例子说明。

例如一项工作中的两个线程:一个线程从传感器中接收数据并且将数据写到共享内存中,同时另一个线程周期性的从共享内存中读取数据并发送去显示,下图描述了两个线程间的数据传递:

在这里插入图片描述
如果对共享内存的访问不是排他性的,那么各个线程间可能同时访问它,这将引起数据一致性的问题。

例如,在显示线程试图显示数据之前,接收线程还未完成数据的写入,那么显示将包含不同时间采样的数据,造成显示数据的错乱。

将传感器数据写入到共享内存块的接收线程 #1 和将传感器数据从共享内存块中读出的线程 #2 都会访问同一块内存。为了防止出现数据的差错,两个线程访问的动作必须是互斥进行的,一个线程对共享内存块操作完成后,才允许另一个线程去操作。

同步是指按预定的先后次序进行运行,线程同步是指多个线程通过特定的机制(如互斥量,事件对象,临界区)来控制线程之间的执行顺序,也可以说是在线程之间通过同步建立起执行顺序的关系,如果没有同步,那线程之间将是无序的。

多个线程操作/访问同一块区域(代码),这块代码就称为临界区,上述例子中的共享内存块就是临界区。
线程互斥是指对于临界区资源访问的排他性

当多个线程都要使用临界区资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步。

线程的同步方式有很多种,其核心思想都是:在访问临界区的时候只允许一个 (或一类) 线程运行。

进入 / 退出临界区的方式有很多种:

  1. 调用rt_hw_interrupt_disable()进入临界区,调用rt_hw_interrupt_enable()退出临界区。
  2. 调用rt_enter_critical()进入临界区,调用rt_exit_critical()退出临界区。

信号量

  1. 当停车场空的时候,停车场的管理员发现有很多空车位,此时会让外面的车陆续进入停车场获得停车位;
  2. 当停车场的车位满的时候,管理员发现已经没有空车位,将禁止外面的车进入停车场,车辆在外排队等候;
  3. 当停车场内有车离开时,管理员发现有空的车位让出,允许外面的车进入停车场;待空车位填满后,又禁止外部车辆进入。

管理员就相当于信号量,管理员手中空车位的个数就是信号量的值(非负数,动态变化);停车位相当于公共资源(临界区),车辆相当于线程。车辆通过获得管理员的允许取得停车位,就类似于线程通过获得信号量访问公共资源。

信号量工作机制

信号量是一种轻型的用于解决线程间同步问题的内核对象,线程可以获取或释放它,从而达到同步或互斥的目的。

在这里插入图片描述
每个信号量对象都有一个信号量值和一个线程等待队列,信号量的值对应了资源的实例数目。则表示共有 5 个信号量实例(资源)可以被使用,当信号量实例数目为零时,再申请该信号量的线程就会被挂起在该信号量的等待队列上,等待可用的信号量实例(资源)。

在 RT-Thread 中,信号量控制块是操作系统用于管理信号量的一个数据结构,由结构体 struct rt_semaphore 表示。另外一种 C 表达方式 rt_sem_t,表示的是信号量的句柄,在 C 语言中的实现是指向信号量控制块的指针。信号量控制块结构的详细定义如下:

struct rt_semaphore
{struct rt_ipc_object parent;  /* 继承自 ipc_object 类 */rt_uint16_t value;            /* 信号量的值 */
};
/* rt_sem_t 是指向 semaphore 结构体的指针类型 */
typedef struct rt_semaphore* rt_sem_t;

RT_IPC_FLAG_FIFO 属于非实时调度方式,除非应用程序非常在意先来后到,并且你清楚地明白所有涉及到该信号量的线程都将会变为非实时线程,方可使用 RT_IPC_FLAG_FIFO,否则建议采用 RT_IPC_FLAG_PRIO,即确保线程的实时性。

若删除信号量时,有线程正在等待信号量,那么删除操作会先唤醒该线程(等待线程的返回值是 - RT_ERROR),然后再释放信号量的内存资源。

对于静态信号量对象,它的内存空间在编译时期就被编译器分配出来,放在读写数据段或未初始化数据段上,只需要在使用前对它进行初始化即可。

信号量应用示例

这是一个信号量使用例程,该例程创建了一个动态信号量,初始化两个线程,一个线程发送信号量,一个线程接收到信号量后,执行相应的操作。

#include <rtthread.h>#define THREAD_PRIORITY         25
#define THREAD_TIMESLICE        5/* 指向信号量的指针 */
static rt_sem_t dynamic_sem = RT_NULL;ALIGN(RT_ALIGN_SIZE)
static char thread1_stack[1024];
static struct rt_thread thread1;
static void rt_thread1_entry(void *parameter)
{static rt_uint8_t count = 0;while(1){if(count <= 100){count++;}elsereturn;/* count 每计数 10 次,就释放一次信号量 */if(0 == (count % 10)){rt_kprintf("t1 release a dynamic semaphore.\n");rt_sem_release(dynamic_sem);}}
}ALIGN(RT_ALIGN_SIZE)
static char thread2_stack[1024];
static struct rt_thread thread2;
static void rt_thread2_entry(void *parameter)
{static rt_err_t result;static rt_uint8_t number = 0;while(1){/* 永久方式等待信号量,获取到信号量,则执行 number 自加的操作 */result = rt_sem_take(dynamic_sem, RT_WAITING_FOREVER);if (result != RT_EOK){rt_kprintf("t2 take a dynamic semaphore, failed.\n");rt_sem_delete(dynamic_sem);return;}else{number++;rt_kprintf("t2 take a dynamic semaphore. number = %d\n" ,number);}}
}/* 信号量示例的初始化 */
int semaphore_sample(void)
{/* 创建一个动态信号量,初始值是 0 */dynamic_sem = rt_sem_create("dsem", 0, RT_IPC_FLAG_PRIO);if (dynamic_sem == RT_NULL){rt_kprintf("create dynamic semaphore failed.\n");return -1;}else{rt_kprintf("create done. dynamic semaphore value = 0.\n");}rt_thread_init(&thread1,"thread1",rt_thread1_entry,RT_NULL,&thread1_stack[0],sizeof(thread1_stack),THREAD_PRIORITY, THREAD_TIMESLICE);rt_thread_startup(&thread1);rt_thread_init(&thread2,"thread2",rt_thread2_entry,RT_NULL,&thread2_stack[0],sizeof(thread2_stack),THREAD_PRIORITY-1, THREAD_TIMESLICE);rt_thread_startup(&thread2);return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(semaphore_sample, semaphore sample);
http://www.ds6.com.cn/news/69963.html

相关文章:

  • pc网站做移动端适配查域名的网址
  • 怎么查询网站的空间商做电商如何起步
  • 商务厅网站建设意见百度站长工具怎么查排名
  • 网站建设的程序seo排名优化代理
  • 响应式网站都有哪些柏乡seo快排优化
  • 给六人游做网站开发的黑帽seo排名优化
  • 个人网站建设模板做网站优化推广
  • 俄文视频网站开发百度快照优化seo
  • 站长工具网站查询怎么制作自己的个人网站
  • 网站访问量什么意思贵阳网络推广外包
  • 北京网站设计推荐刻百度竞价是什么意思
  • 网站做wanzhihou杭州百度
  • 上海做产地证在哪个网站录入如何在百度发布广告信息
  • 产品review网站怎么做抖音关键词挖掘工具
  • 最大的b2c平台南京网站设计优化公司
  • 南宁优质手机网站建设公司广东宣布即时优化调整
  • 自己做cdk兑换码网站百度在线客服问答
  • wordpress 谷歌搜索优化设计一年级下册数学答案
  • 老薛主机做多个网站做销售最挣钱的10个行业
  • 做购物网站骗人拼多多seo怎么优化
  • 网站推广外链全球网站访问量排名
  • 模具培训网站建设海外推广渠道都有哪些
  • 中山做网站服务好代刷网站推广链接免费
  • 济南外贸网站建设北京网络营销外包公司哪家好
  • 网站端和移动端分开建设域名一样么长春刚刚最新消息今天
  • 门户网站开发公司平台seo外链工具有用吗
  • p2p金融网站开发方案百度关键词优化方法
  • wordpress数据库引擎鞍山seo优化
  • 南宁做网站推广的公司客户关系管理系统
  • 泸州公司做网站做网络推广为什么会被抓