程序运行时候. 中断. 异步. 还有多线程的一点小知识

来源:互联网 发布:地牢猎手哪个好玩知乎 编辑:程序博客网 时间:2024/06/08 10:03

之前在用nesc编写协议栈代码的时候,遇到一些程序运行过程中的问题。各种问题。
比如在处理某包的时候,在程序任何运行时,都可能被硬件中断打断,可能被某个Timer,fired打断。而程序访问了很多的全局变量。。由于我对tinyos操作系统的一些同步异步机制不太了解,开始协议栈程序运行时,有时候出现一些莫名其妙的错误,当然后来仔细看了tinyOS操作系统的一些同步异步机制后,解决了一些问题。。

反正就是,应用程序在运行过程中,不像只是学和思考C语言编程那么简单。要考虑一些运行时的问题。。。。然后联想起以前学的UNIX高级编程和UNIX网络编程这两门课时候,学过一些线程同步那些章节,然后回顾了一下以前学的一些知识,简单小结一下。

为什么应用程序使用多线程;多线程的好处等,这里就不说了,没开发过这方面的大项目,不太清楚。只是知道书上说了那些描述性的好处。

简单总结一下。

多个线程会共享一些进程的静态数据段的资源,比如在主线程中定义的全局变量。肯定其他线程也能访问的。

在Unix, Linux平台下,我们利用互斥锁来处理全局变量的互斥问题。

考查互斥锁变量,利用互斥锁变量专门关联一个变量。

数据类型: pthread_mutex_t

初始化: pthread_mutex_t macPIB_mutex = PTHREAD_MUTEX_INITIALIZER;

操作函数::

int pthread_mutex_lock(pthread_mutex_t *mutex) //加锁函数,如果mutex被锁住了,此函数会阻塞程序,直到那个锁被释放。

int pthread_mutex_unlock(pthread_mutex_t *mutex) //解锁函数

互斥锁变量适合于防止同时访问某个共享变量,但是我们需要在等待某个条件发生期间让我们进入睡眠,而不是一直的轮询的查询。可以使用 条件变量的数据类型。

考查条件变量

数据类型: pthread_cond_t

初始化:pthread_cond_t count_cond = PTHREAD_COND_INITIALIZER;

操作函数:

int pthread_cond_wait (pthread_cond_t *condptr, pthread_mutex_t *mutexptr)

int pthread_cond_signal (pthread_cond_t *condptr)

注意,我们使一个全局变量,同时关联上一个互斥锁和一个条件变量。

然后如果在调用pthread_cont_wait的时候,已经被锁住了,则睡眠,同时释放mutexptr锁。

具体解释见UNIX网络编程的604-606页。

以上是关于多个线程对共享变量访问的互斥等问题。

我们在创建线程时,主线程需要给线程函数传递参数,注意,那个参数一定要注意,不能传指针。可以传值(C语言函数调用拷贝参数,支持);或者在传之前,动态分配一个内存。具体的例子见UNIX网络编程的588-589页。以及以前课程的PPT。

程序运行的过程,应该还有很多需要学习的相关编程问题。多线程也应该是比较复杂的,很多用处的问题。今天先了解到这里。