Chinaunix首页 | 论坛 | 博客
  • 博客访问: 37727
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 357
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-20 16:26
文章分类

全部博文(41)

文章存档

2014年(41)

我的朋友

分类: LINUX

2014-05-03 23:45:21

线程是一种轻量级的进程,每个线程都有自己的线程ID,同一个进程的不同线程之间共享线程的资源空间(变量、文件描述符。。。)。当然线程也有自己的独立空间,以保存线程的控制信息。
创建一个线程要使用pthread_create函数,其函数原形如下
int pthread_create(pthread_t *restrict thread,const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);
第一个参数是用于获取线程ID,第二个参数是设置线程属性,通常设置为NULL,创建一个默认属性的线程,第三个参数是线程函数,即这个线程要做的任务,第四个参数是要传递给线程函数的参数。

线程的终止函数:
void pthread_exit(void *value_ptr);
参数为线程的返回值

线程取消函数:
int pthread_cancel(pthread_t thread);
线程的取消并不意味着线程结束,它仅仅提出申请。

等待线程结束的函数:
int pthread_join(pthread_t thread, void **value_ptr);
用法跟waitpid差不多

线程注册清理函数:
void pthread_cleanup_pop(int execute);
void pthread_cleanup_push(void (*routine)(void*), void *arg);
更atexit()的功能差不多,但是push和pop要结合使用,pop的参数为一时表示要执行函数,为0不执行。

线程id获取函数:
pthread_t pthread_self(void);

线程id比较函数:
int pthread_equal(pthread_t t1, pthread_t t2);

线程有两种状态:
可结合态(默认情况下是这种状态):进程结束时主线程要调用pthread_join回收线程资源。
分离状态:线程结束时自动释放所有的资源。
设置线程为分离状态的函数:
int pthread_detach(pthread_t thread);

线程的同步:
互斥锁:

 初始化锁
    int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
 阻塞式加锁      int pthread_mutex_lock(pthread_mutex_t *mutex);
非阻塞式加锁       int pthread_mutex_trylock(pthread_mutex_t *mutex);

解锁       int pthread_mutex_unlock(pthread_mutex_t *mutex);

销毁锁       int pthread_mutex_destroy(pthread_mutex_t *mutex);

读写锁:

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
读锁住时,其它线程可读,但不可写
写锁住时,其它线程不可写,不可读

  8 #include
  9 #include
 10 #include
 11
 12 pthread_rwlock_t rwlock;
 13
 14 void cleanup(void *arg)
 15 {
 16     printf("ggu sjdfs  dk!\n");
 17 }
 18
 19 void *do_work(void *arg)
 20 {
 21     while(1)
 22     {
 23         pthread_rwlock_wrlock(&rwlock);
 24         printf("%d do thread work!\n", *(int *)arg);
 25         pthread_rwlock_unlock(&rwlock);
 26     }
 27
 28     return (void *)0;
 29 }
 30
 31 int main()
 32 {
 33     pthread_rwlock_init(&rwlock, NULL);
 34     pthread_t tid;
 35     int ret;
 36     int i;
 37     for(i=0;i<20;i++)
 38     {
 39         ret = pthread_create(&tid, NULL, do_work, &i);
 40         pthread_detach(tid);
 41         if(ret != 0)
 42         {
 43             perror("pthread_create");
 44             exit(1);
 45         }
 46     }
 47     while(1)
 48     {
 49         pthread_rwlock_wrlock(&rwlock);
 50         printf("pig pig pig!\n");
 51         pthread_rwlock_wrlock(&rwlock);
 52     }
 53
 54     pthread_rwlock_destroy(&rwlock);
 55
 56     return 0;
 57 }




阅读(233) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~