当前位置:  技术问答>linux和unix

关于linux下运行线程的问题,请高手帮忙!

    来源: 互联网  发布时间:2015-09-23

    本文导语:  两个线程同时运行时存在的问题: 线程1:画正弦波(原意是把串口接收到的数据画出波形,现画个正弦波用来测试) 线程2:打开串口,初始化串口(115200, 8, 1, "N"),接收串口数据(9600bytes/sec) 如果单个线程运行时,都...

两个线程同时运行时存在的问题:
线程1:画正弦波(原意是把串口接收到的数据画出波形,现画个正弦波用来测试)
线程2:打开串口,初始化串口(115200, 8, 1, "N"),接收串口数据(9600bytes/sec)
如果单个线程运行时,都运行正常;但是如果同时打开两个线程,则画波形速度有快慢之分,串口数据异常(写文件后检查数据发现偶尔要
丢掉几个字节的数据,只运行串口监控线程又正确)。现列出简短代码,让大家指点一下!

如果有高人有心帮忙,我可以把原代码发过来!
//////////////////////////////////////////////////
//画波形的关键代码
void DrawSinLine(int sig)
{
在兼容DC上画波形并bitblt,颜色深度为8位
}

void Timer(int sec, long usec)
{
    struct timeval tvSelect;
    tvSelect.tv_sec = sec;
    tvSelect.tv_usec = usec;
    select(FD_SETSIZE, NULL, NULL, NULL, &tvSelect);
}

void ThreadWave(void* data)
{
//该循环应该是50ms执行一次,本来是调用Timer(0,50*1000),但是考虑到让循环能空出资源,所以延时了一下
while(1)
{
usleep(20000);
Timer(0, 30*1000);
DrawSinLine(0);
}
return;
}
//////////////////////////////////////////////////

//////////////////////////////////////////////////
//串口接收的代码
int OpenComAndReceive()
{
    OpenComPort (0, 115200, 8, "1", 'N'));
    ReceiveChar();
    CloseComPort ();
    exit (0);
}

INT32 ReceiveChar()
{
    sigaction_io.sa_handler = signal_handler_IO;
    sigemptyset (&(sigaction_io.sa_mask));
    sigaction_io.sa_flags = 0;
    sigaction_io.sa_restorer = NULL;

    tv_timeout.tv_sec = TIMEOUT_SEC (CHAR_MAX, GetBaudrate ());
    tv_timeout.tv_usec = TIMEOUT_USEC;
    //tv_timeout.tv_sec = 0;
    //tv_timeout.tv_usec = 10 * 1000;
    while (1) {
usleep(1000);        
        SetPortSig ();
    }                          /* end of while (1) */
    fflush (stdout);
    fflush (stderr);
    close (fd);
    return (0);
}

int SetPortSig ()
{
    sigaction (SIGIO, &sigaction_io, NULL);
    /* allow the process to receive SIGIO */
    if (-1 == fcntl (fd, F_SETFL, O_ASYNC))
        return (-1);
    if (-1 == fcntl (fd, F_SETOWN, getpid ()))
        return (-1); 
    return (0);
}

static void signal_handler_IO (int status)
{
    char            recvbuf[CHAR_MAX];
    int             iReadCount = 0;
    
INT32           retval = 0;
     FD_ZERO (&fs_read);
     FD_SET (fd, &fs_read);

     retval = select (fd + 1, &fs_read, NULL, NULL, &tv_timeout);
     if (retval) 
{
         iReadCount = read (fd, recvbuf, sizeof(recvbuf));
}
     else
         return;

static int      ii = 0;
     if (ii > 1000 * 1024) 
{
printf("nFile Close");
        close (iFile);
        return;
     }
else
{
ii += iReadCount;
lseek(iFile, 0, SEEK_END);
     write (iFile, recvbuf, iReadCount);
}/**/
}
//////////////////////////////////////////////////

int MiniGUIMain (int args, const char* arg[])
{
....
pthread_t th1;
int ret;
struct sched_param scheduling_value;
scheduling_value.sched_priority = 1;
ret = pthread_create(&th1, NULL, &ThreadWave, NULL);
pthread_setschedparam(th1, SCHED_RR, &scheduling_value);

pthread_t th_com;
scheduling_value.sched_priority = 20;
ret = pthread_create(&th_com, NULL, &OpenComAndReceive, NULL);
pthread_setschedparam(th_com, SCHED_RR, &scheduling_value);
....
}


|
你用的什么系统,有些linux或unix的线程是靠线程库支持的,内核不支持,即所谓的伪线程,这类线程在执行一般的运算没问题,但涉及到IO操作时会出现异常。

|
我觉得问题可能出在:
线程1和线程2存在共享内存段
如1画图所用数据buffer和2串口接受数据buffer相同
那么可能会出现串口数据接收错误或正弦波形不连续等错误
解决的方法是设置互斥量
在一个线程中对共享数据进行操作时
不允许另一个线程操作该数据


|
还有select (fd + 1, &fs_read, NULL, NULL, &tv_timeout)
使用定时阻塞方式
换成非阻塞方式看看

|
gz

|
不知道跟进程的优先级有没有关系
你把两个进程的优先级设成相等看看

    
 
 

您可能感兴趣的文章:

  • Windows和Linux下C++类成员方法作为线程函数方法介绍
  • 请问Linux核心支持多线程吗?开发库有线程库吗?线程好用吗?(稳定?)
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 求个linux多线程编程的例子,要有线程池的 通用些更好
  • 请问Linux下线程开销为什么这么大?一个线程要占用近10M内存
  • Linux多线程时一些线程分不到时间片
  • 说说windows线程和linux线程的区别?
  • linux 下多线程 每个线程能否使用alarm来处理,信号是否会乱呢?
  • linux下,如何在多线程中每个线程设置一个定时器,在线等,急。。。谢谢
  • 在创建linux线程时为什么会多一个线程?
  • linux如何主动将线程放入到线程调度队列中重新排队?
  • 在linux RH73下为什么单进程只能开1021个线程线程.
  • Linux下如何让主线程挂起一个指定的时间段而子线程继续运行?谢谢
  • LINUX下有没有线程概念,和WIN下线程概念有什么不同,谢谢.
  • linux线程编程问题
  • linux线程最大数,奇怪,怎么只有300?而且线程是用完就没了,不是同时300啊!
  • 跪求:linux下pthread 双线程计算和单线程的运行时间完全相同是为什么?
  • linux线程与进程的问题
  • linux 下子线程不能执行的问题?
  • linux多线程编程的问题
  • linux多线程编程
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 弱弱地问,能否让WINDOWS下自动运行的多媒体光盘在LINUX下也自动运行播放(LINUX下可一看到光盘上文件)
  • 我的linux程序 如何 在pc机器上运行。现在我用arm-linux-g++ 编译后的程序在我的嵌入设备上运行。
  • 程序在windows下用visual运行正常,如何才能在linux下运行??
  • 怎样让linux启动后不运行桌面而是直接运行某个应用程序呢?
  • Linux下的程序是在内存中运行的吗?为什么在程序运行的时候可以删除程序文件?
  • linux编写一个脚本判断程序是否在运行,如果没运行就重启这个软件。
  • 请问如何让Linux 0.11运行?它运行后是怎样的?谢谢!!
  • 新手提问:grep在linux中运行跟在php运行返回结果不一样
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux!我来了------我是新人,还请大家多多帮忙
  • 装linux遇到问题,有高手在线帮忙吗?请发信息给我
  • 各位,帮忙推荐几本深入学习Linux的书!!!
  • 请问想学linux,请帮忙推荐一本好书?
  • 关于linux裁剪内核,越小越好。大家多多帮忙。
  • 我的linux声卡装不上,达人帮忙!
  • linux下的串口编程比较熟悉,麻烦帮忙!
  • 高手帮忙!linux初次安装的问题?
  • 高手们快来帮帮忙啊,,好郁闷!!!LINUX 9.0装不上的问题!
  • 帮忙推荐一本linux编程的好书!!!
  • 大家帮忙,推荐个好版本的Linux
  • 急!高手帮忙!cximage库在Linux下运行使用的问题。
  • 帮忙推荐个linux
  • linux的网络访问?请帮忙!
  • ★★★在linux下编译pro*c文件,提示"sqlcxt"没有定义,哪位高手帮忙,定赠分!
  • 急!大家帮帮忙!有哪些视频点播系统能在在LINUX下安装以及怎样安装!
  • 急!大家帮帮忙!有什么视频点播系统能在LINUX下安装,以及怎样安装!!
  • 请各位帮忙推荐几本Linux多进程编程的好书
  • 升级Linux的问题,急!请高手帮忙!
  • Linux学习,高手帮忙
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3