你知道linux同步机制的complete?

 在     Linux      内核中,comple     ti      on是一种简单的同步机制,标志"things may proceed"。

要使用comple  TI on,必须在文件中包含,同时创建一个类型为struct comple  TI on的变量。

 你知道linux同步机制的complete?_设计制作_测量仪表

[cpp] view pl     ai   n copy

这个变量可以静态地声明和初始化:

DECLARE_COMPLE  TI ON(my_comp);

或者动态初始化:

struct comple  TI on my_comp;

init_completion(&my_comp);

如果驱动程序要在执行后面操作之前等待某个过程的完成,它可以调用wait_for_completion ,以要完成的事件为参数:

[html] view plain copy

void wait_for_completion(struct completion *comp);

wait_for_completion等待在completion上。如果加了in     te   rruptible,就表示线程等待可被外部发来的信号打断;如果加了killable,就表示线程只可被kill信号打断;如果加了timeout,表示等待超出一定时间会自动结束等待,timeout的单位是系统所用的时间片jiffies(多为1ms)。

如果其它部分代码可以确定事件已经完成,可以调用下面两个函数之一来唤醒等待该事件的进程:

[cpp] view plain copy

void complete(struct completion *comp);

void complete_all(struct completion *comp); /* Linux 2.5.x以上版本 */

前一个函数将只唤醒一个等待进程,而后一个函数唤醒等待该事件的所以进程。由于completion的实现方式,即使complete在wait_for_competion之前调用,也可以正常工作。
例如,在MD设备驱动程序实现中,有一个恢复线程md_recovery_thread。驱动程序通过md_register_thread和md_unregister_thread来注册和注销恢复线程。恢复线程的执行逻辑在md_thread函数中,大致如下:

[cpp] view plain copy

int md_thread(void * arg)

{

线程初始化;

while (运行) {

处理逻辑;

接收信号;

}

return 0;

}

md_register_thread将创建一个恢复线程,它必须在线程真正初始化结束之后才能返回该线程的指针。因此,其逻辑是:

[cpp] view plain copy

mdk_thread_t *md_register_thread(void (*run) (void *), void *data, const char *name)

{

mdk_thread_t *thread;

……

struct completion event;

/* 为线程分配空间 */

thread = (mdk_thread_t *) kmalloc (sizeof(mdk_thread_t), GFP_KERNEL);

……

init_completion(&event);

……

thread->event = &event;

/* 创建内核线程 */

ret = kernel_thread(md_thread, thread, 0);

/* 等待线程初始化结束 */

……

wait_for_completion(&event);

/* 返回线程指针 */

return thread;

}


而md_unregister_thread通过向线程发送SIGKILL信号注销恢复线程,它也需要在线程真正退出后才能释放线程所占用的内存。因此,其逻辑是:

[cpp] view plain copy

void md_unregister_thread(mdk_thread_t *thread)

{

struct completion event;

init_completion(&event);

thread->event = &event;

……

/* 向线程发送SIGKILL信号终止其运行 */

md_interrupt_thread(thread);

/* 等待线程退出 */

wait_for_completion(&event);

/* 释放线程所占用的内存 */

kfree(thread);

}

如果考虑completion,md_thread的逻辑是:

[cpp] view plain copy

int md_thread(void * arg)

{

线程初始化;

complete(thread->event);

while (运行) {

处理逻辑;

接收信号;

}

complete(thread->event);

return 0;

}

需要说明的是,由于等待事件是在驱动程序和恢复线程中的一个共享资源,它必须是一个全局变量,或者如实现代码中,定义为一个局部变量,而将其指针放在恢复线程结构中。
typedef struct mdk_thread_s {
……
struct completion *event;
……
} mdk_thread_t;



3
94
0
42

相关资讯

  1. 1、央视太宠肖战新剧,独家披露幕后感人花絮,并给出四字好评4526
  2. 2、《小舍得》持续霸榜,这位圈内大佬的拒演,反让李佳航成了大赢家975
  3. 3、菜菜绪主演日剧收视惨败观众指责乱起用艺人4654
  4. 4、嫁豪门为生子怀孕8次流产4次,净身出户72岁仍不停歇2927
  5. 5、《全民目击》观影指南:原来是当毒战遇见寒战4318
  6. 6、因8000万和周星驰决裂,还讽刺星爷不懂电影,今下场让人唏嘘2106
  7. 7、记得《爱情公寓》里的诺澜?现开启“崩溃式长开”,美成男人梦想4524
  8. 8、鹰眼自曝《复联4》全新片场照带伤妆帅气依旧3001
  9. 9、本以为会和戚薇唐嫣一样火,结果却埋没了七年,最后靠演反派逆袭1960
  10. 10、台媒曝出苏有朋和马思纯疑似交往,网友的评论亮了2607
全部评论(0)
我也有话说
0
收藏
点赞
顶部