线程就是进程内部的执行流,一个进程至少有一个线程,线程拥有自己的私有资源同时也会和进程共享资源。
当前工作目录
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
参数:
有三种方式终止一个线程。
#include <pthread.h>
void pthread_exit(void *retval);
参数:
retval:保存线程退出码,<font color="#dd00dd">这个指针一定要是全局变量或者堆上开辟的。</font><br/>
#include <pthread.h>
int pthread_cancel(pthread_t thread);
参数:
thread:结束的线程ID(可以结束任意线程)
返回值:
成功返回0,失败返回错误码。
线程的终止不能用exit(),这是进程的终止方式。
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
参数:
thread:等待线程的ID
retval:保存退出状态码
返回值:
成功返回0,失败返回错误码。
当我们不关心线程的退出状态,只希望线程结束系统会自动清理和释放资源,这时我们就可以使用线程分离。
#include <pthread.h>
int pthread_detach(pthread_t thread);
参数:
thread:分离的线程ID
返回值:
成功返回0,失败返回错误码。
线程一旦被pthread_detach()分离,就不能再用pthread_join()获取其状态了,也不能再返回链接状态。
在前面pthread_create()函数时,就涉及到pthread_attr_t *attr线程属性,我们可以手动设置线程属性。
int pthread_attr_init(pthread_attr_t *attr);//初始化线程属性
int pthread_attr_destroy(pthread_attr_t *attr);//销毁线程属性对象
Detach state = PTHREAD_CREATE_JOINABLE//分离属性
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);//设置分离属性
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);//获得分离属性
Scope = PTHREAD_SCOPE_SYSTEM//抢夺资源范围
Inherit scheduler = PTHREAD_INHERIT_SCHED//是否继承线程调度策略
Scheduling policy = SCHED_OTHER//调度策略
Scheduling priority = 0//调度优先级
Guard size = 4096 bytes//线程栈之间的安全区
Stack address = 0x40196000//自己指定线程栈
Stack size = 0x201000 bytes//栈的大小
线程属性这一块,本文只是简单列出,更深层次的掌握需要大家自行查阅资料。
自旋锁和互斥所的区别:互斥锁是当阻在pthread_mutex_lock时,放弃CPU,好让别人使用CPU。自旋锁阻塞在spin_lock时,不会释放CPU,不断的问CPU可以使用了不
读读共享,读写排他,写写排他,写锁优先.
pthread_mutex_t mutex;//创建互斥量
int a = 0;
int b = 0;
void *r1(void* arg) //线程1执行函数
{
while(1)
{
pthread_mutex_lock(&mutex);//上锁
a++;
b++;
if(a != b)
{
printf("%d != %d\n",a,b);
}
pthread_mutex_unlock(&mutex);//解锁
}
}
void *r2(void* arg)//线程2执行函数
{
while(1)
{
pthread_mutex_lock(&mutex);
a++;
b++;
if(a != b)
{
printf("%d != %d\n",a,b);
}
pthread_mutex_unlock(&mutex);
}
}
int main(void)
{
pthread_t t1,t2;
pthread_mutex_init(&mutex,NULL);//初始化互斥量
pthread_create(&t1,NULL,r1,NULL);//创建线程
pthread_create(&t2,NULL,r2,NULL);//创建线程
pthread_join(t1,NULL);//线程等待
pthread_join(t2,NULL);
return 0;
}
原文地址:http://blog.51cto.com/13449864/2119632