当前位置: 技术问答>linux和unix
【在线等】在编写多线程遇到了问题,哥们,帮个忙,急得不行了
来源: 互联网 发布时间:2016-07-06
本文导语: 一个串口的互斥访问问题:我想用一个线程来实时监测串口,然后根据这个线程收到串口的数据解析获得的不同数据后 在创建相应的子线程来完成不同的任务,这个监测线程一直在运行,其他的线程是动态的创建的。 问题: ...
一个串口的互斥访问问题:我想用一个线程来实时监测串口,然后根据这个线程收到串口的数据解析获得的不同数据后
在创建相应的子线程来完成不同的任务,这个监测线程一直在运行,其他的线程是动态的创建的。
问题:
监测线程是使用串口(只是检测是否可读),其他的子线程有时候又要向串口写入数据,我就写了个互斥的向uart1写的函数 int write_to()
这个函数在多个子线程中都要用到,就是说write_to()函数在检测线程向串口1写入数据时候只能用
pthread_create(&id,NULL,(void *)write_to,(void *)permerter)来使用,我是为了检测线程不会因为write_to()阻塞了而停止监视。而在子线程中要写入数据的时候是调用该线程呢还是在子线程中动态的也创建该write_to()函数???????
这个函数是不是编程临界资源了吗???该怎么使用这个函数?????
int write_to(PARAMETER *parameter)
{
int q=1; //用于控制循环检测可写的uart1或者tosmac_dev句柄
int rc; //成功写入的字节数
struct timaval timeout={3,0};
FD_ZERO(&tosmac_dev_write);
if(parameter->fd==uart1) //串口1
if(串口1)
{
FD_ZERO(&uart1_write); //清零写集合
FD_SET(uart1, &uart1_write); //将uart1加入读写描述符集合中
while(q)
{
switch (select(uart1 + 1, NULL,&uart1_write, NULL,&timeout))
{
case -1:
perror("write_to select"); break;
case 0:
printf("write_to select等待超时n"); break;
default:
if(FD_ISSET(uart1,&uart1_write)) //uart1满足写的条件,可以执行写
{
rc=write(parameter->fd,parameter->buffer,patameter->size);
if(rc==parameter->size)
{printf("uart1写入数据成功n");
q=0;
}
break;
}
}
}
}//end if
。。。。。。。
}
|
建议对这个函数外再包一层, 外层当作线程的主体
所有线程对write_to的调用之前都需要进程pthread_mutex_lock操作, 得到lock之后才能写.
监视线程在调用write_to之前, 调用pthread_mutex_trylock, lock成功则调用write_to, trylock不成功, 则等待片刻, 再进行下一次的trylock
所有线程对write_to的调用之前都需要进程pthread_mutex_lock操作, 得到lock之后才能写.
监视线程在调用write_to之前, 调用pthread_mutex_trylock, lock成功则调用write_to, trylock不成功, 则等待片刻, 再进行下一次的trylock
|
pthread_mutex_t mutex;
pthread_mutex_lock(&mutex);
//临界区
....
pthread_mutex_unlock(&mutex);
pthread_mutex_lock(&mutex);
//临界区
....
pthread_mutex_unlock(&mutex);
|
请注意,在编写多线程的时候一定要考虑你设置的全局变量的使用情况,这样的一般都要考虑用到锁的问题,所以请你去了解一下有关锁的使用,
|
帮顶!
|
同意楼上的
|
只要你这个函数具有可重入性就可以