linux系统中实现阻塞有哪些方法 等待队列 自旋锁 中断

linux系统中实现阻塞有哪些方法 等待队列 自旋锁 中断,第1张

你只在 server 进程中(对应spid==0),调用 open_queue 来打开消息队列,即msqid只在这个进程中有效,在host进程中(对应cpid==0),由于msqid无效,所以无法发送消息。 解决方法:只要把 do { msqid = open_queue(key)} while (msqid == -1) 这段代码移到第一个fork之前,这样所有的进程中的msqid就都指向那个队列了。 还有问题可以baidu hi我,别忘了加分。

1、在内核多线程编程时,为了保护共享资源通常需要使用锁,而使用的比较多的就是spinlock,但需要注意的是:所有临界区代码都需要加锁保护,否则就达不到保护效果。也就是,访问共享资源的多个线程需要协同工作共同加锁才能保证不出错。在实际写代码时,有时候会网掉这一点,以致出现各种稀奇古怪的问题,而且很难找到原因。

2、在出现两个和多个自旋锁的嵌套使用时,务必注意加锁和解锁的顺序。

比如:在线程1中,spinlock A ->spinlock B ->spin unlock B ->spin unlock A ;那么,在需要同步的线程2中,若需要加相同的锁,则顺序也应该保持相同,spinlock A ->spinlock B ->spin unlock B ->spin unlock A ;否则,很有可能出现死锁。

3、spinlock保护的代码执行时间要尽量短,若有for循环之类的代码,则一定要确保循环可以在短时间可以退出,从而使得spinlock可以释放。

4、spinlock所保护的代码在执行过程中不能睡眠。比如,在spinlock和spinunlock之间不能调用kmalloc, copy_from_user,kthread_stop等调用,因为这些函数调用均有可能导致线程睡眠。

5、spinlock在实际使用时有如下几种类型,spin_lock,spin_lock_bh,spin_lock_irqsave。在具体使用时,需要根据被保护临界区锁处的上下文选择合适的spinlock类型。

spin_lock用于不同cpu线程间同步,spin_lock_bh和spin_lock_irqsave主要用于本cpu线程间的同步,前者关软中断,后者关硬中断。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8506723.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-17
下一篇 2023-04-17

发表评论

登录后才能评论

评论列表(0条)

保存