关于Linux多线程互斥共享资源

lchx8245 2008-08-27 09:24:47
我现在要解决一个USB口占用和冲突的问题,我用了一个死循环来从控制端口发送请求数据的命令(写),然后通过数据端口来接收设备发送过来的数据(读),写一次读到一桢图像数据,我用了一个死循环来不停的写和读,这样我就可以不停的接收图像数据并显示,这样for(;;){write; read; display;}
而我现在还要在显示图像(即要不停的写和读,而写必须要用控制端口)的同时,通过控制端口发送其它控制命令,如读图像的各种参数给USB设备,设备从这个控制端口再给我回数据,这样{send; recv;}用一个按钮来实现,send要用到控制端口,这样按按钮的时候控制端口有时就会冲突和卡死,请问各位大虾,我这里是不是涉及到了资源的共享,这里在按按钮的时候要停止那个图像数据的传输吗,是的话该怎么实现呢?用信号量?还是互斥锁?想到用这些,但是具体不知道怎么用,请各位大虾指点。
...全文
195 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lchx8245 2008-09-11
  • 打赏
  • 举报
回复
谢谢各位的指点,问题好像是解决了,我用信号量后,sem_post(),write,read,sem_wait(),效果好像要好些,再把那个for(;;)的死循环改用条件循环while(running){write,read,display},通过改变条件变量的值也可以停止它。
test4ever 2008-08-28
  • 打赏
  • 举报
回复
互斥等待是一种方法

你的写可以是overlapped的么?你在send之前判断一下端口是否已经释放,或者说已经完成上一个传输操作,然后再send.

做好能进去追一下,卡死会不会是进死循环了

供参考
gudeyouxiang 2008-08-27
  • 打赏
  • 举报
回复
mfd = open("/tmp/myapp", O_WRONLY|O_CREAT);

if(mfd <= 0)
{
perror("fuck:");
return 0;
}
mret = flock(mfd, LOCK_EX);
if(mret!=0)
{
perror("fuck:");
return 0;
}
/////////////////
这里你要进行的操作
//////////////////
mret = close(mfd);
快乐田伯光 2008-08-27
  • 打赏
  • 举报
回复
知道用锁用信号量了,就去google锁和信号量的用法呀
qizhao2001 2008-08-27
  • 打赏
  • 举报
回复
用锁,大概思路是原子操作:

send_and_read(...)
{
lock();
send();
read();
unlock();
}
ynicle 2008-08-27
  • 打赏
  • 举报
回复
看不大懂你的问题.
不过看来起来, 控制端口和数据端口是两个不同东西, 而其你顺序来的,应该不会涉及资源冲突的问题.是不是你的 USB driver不是很稳定?

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧