文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>linux 线程 笔记

linux 线程 笔记

时间:2010-10-14  来源:noyear

 1,__clone函数简介
#include <sched.h>
int __clone(int (*fn)(void *fnarg), void *child_stack, int flags, void
*arg);
这是一个比fork更精确的产生进程的方式
第一个参数(*fn)(void *fnarg)是一个函数指针,当执行子进程时调用这个函
数。
第二个参数child_stack是指向你为子进程分配的堆棧的指针,
第三个参数flag通过把多种CLONE_*标志进行“或”操作来得到。
CLONE_VM 父进程和子进程运行在同一内存空间(在可应用的地方共享内存映
像)    !若不设置,和fork一样,子进程接受它自己的 份父进程内存空间副本。
CLONE_FS 父进程和子进程共享在root文件系统,当前工作目录及umask信
息。   !若不设置,子进程接受父进程文件系统信息的副本,彼此独立。
CLONE_FILES 父进程和子进程共享文件描述符  !若不设置,子进程仍然会继承
父进程的文件描述符,但对这些文件描述符的read,write,open和close操作都不会
影响到父进程。反之亦然。
CLONE_SIGHAND 父进程和子进程共享设置在父进程上的信号处理器  !若不设
置,子进程仍然继续一份父进程的信号处理副本,但在子进程中的sigaction调用
不会影响父进程的信号处理器,反之亦然。
CLONE_PID 父进程和子进程有相同的PID  !若不设置,子进程接受一个惟一的
PID.
第四个参数arg被传送给子函数,它的取值和用法完全自主决定。

2,pthread接口
应用线程场合:
#在返回前阻塞的I/O任务能够使用一个线程处理I/O, 同时继续执行其它处理。
#需要响应的任何用户界面(UI)能够使用一个或多个线程进行后台处理,同时
保持对用户输入的响应。
#在一个或多个任务不确定性事件,比如网络通信或一种稀有资源的可获得性影
响的场合,能够使用线程处理这些异步事件同时继续执行正常的处理。
#如果某些程序功能比其它的功能更重要,可以使用线程以保证所有功能都出
现,但那些时间密集型的功能具有更高的优先级。
1》pthread_create函数
#include <pthread.h>
int pthread_create(pthread_t *thread,
   pthread_attr_t *attr,
   void *(*start_routine)(void*).
   void *arg);
//thread保存新线程的标识符。
2》pthread_exit 函数
#include <pthread.h>
void pthread_exit(void *retval);
3》pthread_join函数
它挂起当前线程,直到th指定的线程终止运行为止。
#include <pthread.h>
int pthread_join(pthread_t th,void **thread_return);
int pthread_detach(pthread_t th);
//如果另一个线程的返回值不为NULL,则保存在hread_return指向的地址中。
//第二个函数使线程处于被分离的状态。
4》pthread_atfork函数
#include <pthread.h>
int pthread_atfork(void (*prepare(void),
   void (*parent)(void),
   void (*child)(void));
//它登记了3个处理函数,它们在创建一个新线程的某些时候被调用。
prepare指向的函数在创建新线程之前被调用。
parent函数在父进程中随后被调用,
child指向的函数在子进程一创建好就在子进程中被调用。
它们都可以为NULL,被忽略。

//这个函数可能被POSIX 线程标准除去,所以要谨慎使用。
5》取消线程pthread_cancel
#include <pthread.h>
int pthread_cancel(pthread_t thread);
int pthread_setcanclestate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);
void pthread_testcancel(void);
//pthread_setcancelstate函数可以设置自己的取消夶,如果state为
PTHREAD_CANCEL_ENABLE,则允许請求取消。state为PTHREAD_CANCEL_DISABLE,忽
略取消請求。
//pthread_setcanceltype改变一个线程对取消請求的响应试。如要type为
PTHREAD_CANCEL_ASYNCHRONOUS,线程会被立即取消,type为
PTHREAD_CANCEL_DEFERRED则会延迟取消线程直到达到一个取消点。
//pthread_testcancel设置取消点。如果有任何被 挂起的取消請求,这个函数
这会取消当前 线程。

/*这里测试过的pthread_setcancelstate 失效,不解*/
6》pthread cleanup 宏 
宏 pthread_cleanup_push宏登记了一个处理函数routine,当调用pthread_exit
终止线程或者线程允许取消請求求同时又达到了一个取消点时,就用arg指定的空
指针参数 调用这个处理函数。
#include <pthread.h>
void pthread_cleanup_push(void (*routine), (void *),void *arg);
void pthread_cleanup_pop(int execute);
void pthread_cleanup_push_defer_np(void (*routine)(void*),void *arg);
void pthread_cleanup_pop_restore_np(int execute);
7》pthread 条件
#include <pthread.h>
pthread_cond_t cond = pthread_cond_initiallizer;
//pthread_cond_init 初始化一个类型为cond_t的对象 cond.
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t
*cond_attr);
// 第二个参数被Linux忽略。多数 linux只是简单的把
PHTREAD_COND_INITIALIZER复制 给cond_attr.
int pthread_cond_signal(pthrad_cond_t *cond);
//这是用于重启一个并且 是惟一的一个正在等待条件的线程。
int pthread_cond_broadcast(pthread_cond_t *cond);
//重启所有正在等待条件的线程。
int pthread_cond_wait(pthread_condt *cond,pthread_mutex_t *mutex);
int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex_t
*mutex,const struct timespec *abstime);
//它只等待abstime指定的时间,使用经典 的UNIX紀元时间,即从1970.1.1 至
今的时刻的秒数。 故与系统调用time返回值兼容。
int pthread_cond_destroy(pthread_cond_t *cond);
// 它只是检查没有线程正在等待条件的情况。

8》pthread_equal函数
如果两个线程引用了同一个线程,则函数返回一个非零舉,否则它返回0.
#include <pthread.h>
int pthread_equal(pthread_t thread1, pthread_t thread2);


3,线程属性。
线程属性控制着一个线程在它整个生命周期里的行为.
属性           值      含义
detachstate     PTHREAD_CREATE_JOINABLE(默认)  可切入 的状态 
PTHREAD_CREATE_DETACHED        被分离的状态
schedpolicy SCHED_OTHER(默认)      正常,非实时
SCHED_RR        实时,循环
SCHED_FIFO        实时,先入先出
schedparam 与策略有关
inheritsched PTHREAD_EXPLICIT_SCHED(默认)   由schedpolicy和schedparam设
置,从父进程继承。
PTHREAD_INHERIT_SCHED     进程继承
scope PTHREAD_SCOPE_SYSTEM(默认)   一个线程一个系统时间片,线程共享系
统时间片
PTHREAD_SCOPE_PROCESS

4,互斥
加锁和解锁
任何线程都能访问解锁互斥但它却不归任何线程所有。
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, const
pthread_mutexattr_t *mutexattr);
//mutexattr可取值
PTHREAD_MUTEX_INIALIZER 创建一个快速互斥
PTHREAD_MUTEX_RECURSIVE_MUTEX_INITIALIZER_NP  创建一个递归互斥
PTHREAD_MUTEX_ERRORCHECK_MUTEX_INITIALIZER_NP 创建一个检错互斥 

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
//不在mutex已经加锁时阻塞调用线程,而是立即返回出错代码EBUSY.
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
//清除mutex引用 的互斥并且释放互斥占有的任何资源。

相关阅读 更多 +
排行榜 更多 +
超级冒险王安卓版

超级冒险王安卓版

休闲益智 下载
玩具小镇手机版

玩具小镇手机版

休闲益智 下载
这一关特上头手机版

这一关特上头手机版

休闲益智 下载