原创 linux应用编程之网络(5)多线程and文件IO

2011-3-3 21:27 2940 6 6 分类: MCU/ 嵌入式

多线程编程

缺省创建的线程属性经测试为

SCHED_OTHER(非实时策略,时间片)

SCOPE_SYSTEM(系统竞争范围

PTHREAD_INHERIT_SCHED(继承主线程属性)

PTHREAD_CREATE_JOINABLE(非分离)

在多个线程访问临界资源时,最好用互斥锁,来使一次只能让一个线程访问。

也可以用信号量(无名信号量,进程中用的是有名信号量)来实现线程的同步与互斥。

条件变量也常用;

 

线程之间的内存共享的,各个线程之间不需要像进程之间那样用一些操作系统提供的机制来实现通信。我们可以自己建立一些数据结构,如队列,链表等,再加上一些阻塞的机制,如信号量,互斥锁等。来实现如进程进制中的通信。

经测试实验,在线程中也可以用有名管道,消息队列进行通信。

有名管道的读写在其数据小于系统定义的PIPE_BUF时,是原子操作。无需做临界访问相关的保护。

关于线程属性的详细总结,请看另外一篇《关于linux线程调度策略的学习》

 

关于线程条件变量的用法(线程使用手册上有很好的说明)

本人一般这样用:

//等待sample_flag ==1 为条件

While(1)

{

pthread_mutex_lock(&sample_lock);

while( !sample_flag)

{

            dprintf("wait sample cond \n");

            pthread_cond_wait( &sample_cond, &sample_lock);

}

pthread_mutex_unlock(&sample_lock);

Do something ............

}

 

// 清标志

pthread_mutex_lock(&sample_lock);

    sample_flag = 0;

pthread_mutex_unlock(&sample_lock);

//

//置位标志

pthread_mutex_lock(&sample_lock);

    sample_flag = 1;

    pthread_cond_broadcast(&sample_cond); //广播信号量,启动等待的语音视频接收线程

    pthread_mutex_unlock(&sample_lock);

文件io

对于文件的读写,优先使用标准io.一是因为标志i/o提供缓冲流,可以尽量减少系统调用的数量,同时标准i/o方便移植。一般与硬件相关的操作都用基于文件描述符的i/o操作(其兼容posix标准)。

 

Read(),Write(), fread(),fwrite函数后,文件位置都会自己变化。其返回值都为实际读取或写入的数,read(),fread若返回0,则表示已经达到文件尾。

可以用lseek()函数,来指定文件的偏移量。

 

Open()和fopen()打开文件的具体情况,选择具体的参数。一般如果尽量以只读或只写来打开(如果打开该文件只为了写,则以只写打开,不要以读写打开),这样来避免在后面的操作中的一些习惯错误操作。

 

注意现象:

1)如果一个文件正在使用(如已经open未close),则用标准IO操作时(fopen)可能导致打开失败,而用基于文件描述符的IO(open)则没有此现象。

2)养成好习惯,在哪个函数中打开文件,则在该文件中关闭文件。在不用时该文件了,就尽快把其关闭。以免在未关闭的情况下,系统断电,重启等。可能导致文件数据问题。

多路复用:

Slect()也常用来做定时,sleep等。APUE上说其比sleep.usleep等好用

POLL()

串口应用:参考:

linux串口编程 非规范模式 read()问题

 

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条