线程是一种轻量级的进程,每个线程都有自己的线程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 }
阅读(253) | 评论(0) | 转发(0) |