<<<<<<<线程>>>>>>>
#include <pthread.h>
函数:
【创建线程:】
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*routine)(void *), void *arrg);
thread:线程标示符
attr:线程属性设置
routine:线程函数的起始地址,指向void的指针作为参数和返回值的函数指针
attr:传递给routine的参数
<<成功:0 错误:错误代码>>
pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
detachstate:PTHREAD_CREATE_DETACHED(分离线程)
PTHREAD _CREATE_JOINABLE(非分离线程)
创建分离线程的步骤
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&tid, &attr, THREAD_FUNCTION, arg);
【线程退出函数:】
int pthread_exit(void *retval);
retval:线程结束时的返回值,由其他函数pthread_join()来获取
【回收线程:】
int pthread_join(pthread_t th, void **thread_return);
th:等待线程的标示符
thread_return:用来接收pthread_exit()函数的指针
<<成功:0 错误:错误代码>>
-------------------------------------------------------------------------------------------
//创建一个线程并使线程完成相应的工作:
No.1:pthread_t id1,
No.2:ret = pthread_create (&id1, NULL, (void *) pthread1, NULL);
No.3:pthread_join (id1, NULL);
-------------------------------------------------------------------------------------------
<<<<<<<Linux线程间的同步:信号量(无名信号)>>>>>>>
函数:
【信号量初始化函数:】
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem:信号量指针
pshared:决定信号量能在几个进程间共享,0:多线程同步,>0多进程同步
目前Linux还没实现进程间信号量的共享,所以取0;
<<成功:0 失败:-1>>
【P、V操作; 其他函数】
int sem_wait(sem_t *sem);//P操作 sem-1
int sem_pos(sem_t *sem);//V操作 sem+1
int sem_trywait(sem_t *sem);//非阻塞,出错返回非零,若阻塞返回EAGAIN
int sem_getvalue(sem_t *sem);//获取sem值
int sem_destroy(sem_t *sem);//回收
<<成功:0 失败:-1>>
-------------------------------------------------------------------------------------------------
//测试程序:线程1工作时线程2阻塞,线程2工作时线程1阻塞,周而复始(无名信号量)
No.1: 定义信号量并初始化:
sem_t sem1, sem2;
ret = sem_init (&sem1, 0, 1);//初始化信号量1为资源可用
ret = sem_init (&sem2, 0, 0);//初始化信号量2为资源不可用
No.2:定义两个线程并初始化:
pthread id1, id2;
ret = pthread_create (&id1, NULL, (void *) pthread1, NULL);
//创建线程1(id1)并选择线程执行函数
ret = pthread_create (&id2, NULL, (void *) pthread2, NULL);
//创建线程2(id2)并选择线程执行函数
No.3:线程一种:
sem_wait (&sem2); //P操作
具体操作内容
sem_post (&sem1);//V操作
No.4:线程二种:
sem_wait (&sem1); //P操作
具体操作内容
sem_post (&sem2);//V操作
No.5:回收线程
pthread_join (id1, NULL);//回收线程1(id1)
pthread_join (id2, NULL);//回收线程2(id2)
-------------------------------------------------------------------------------------------------------------
<<<<<<<Linux线程间的互斥:互斥锁>>>>>>>
#include<pthread.h>
函数:
【初始化互斥锁:】
int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr);
mutex:互斥锁
mutexattr
PTHREAD_MUTEX_INITIALIZER:快速创建互斥锁
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP:创建递归互斥锁
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:创建检错互斥锁
<<成功:0 错误:错误代码>>
【申请、释放、回收互斥锁:】
int pthread_mutex_lock(pthread_mutex_t *mutex);//申请互斥锁
int pthread_mutex_lock(pthread_mutex_t *mutex);//非阻塞申请
int pthread_mutex_unlock(pthread_mutex_t *mutex);//释放互斥锁
int pthread_mutex_destroy(pthread_mutex_t *mutex);//回收锁
<<成功:0 失败:-1>>
-------------------------------------------------------------------------------------------------------------
//测试程序,静态互斥锁(全局)
No.1:定义全局变量:互斥锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
N0.2:定义两个线程并初始化;互斥锁初始化
pthread_t id1, id2;
ret = pthread_create (&id1, NULL, (void *) pthread1, NULL);
ret = pthread_create (&id2, NULL, (void *) pthread2, NULL);
No.3:线程一:
申请互斥锁:if (pthread_mutex_lock (&mutex) < 0){perror}
进行操作内容
释放互斥锁:if (pthread_mutex_unlock (&mutex) < 0){perror}
No.4:线程二:
申请互斥锁:ret = pthread_mutex_trylock (&mutex)if(ret != 0){perror}
进行操作内容
释放互斥锁:if (pthread_mutex_unlock (&mutex) != 0){perror}
No.5:
pthread_join (id1, NULL);//回收线程
pthread_join (id2, NULL);//回收线程
pthread_mutex_destroy (&mutex);//回收
-------------------------------------------------------------------------------------------------------------
// 动态初始化
No.1:定义全局锁(全局变量)
pthread_mutex_t mutex;
N0.2:定义两个线程;互斥锁初始化;线程初始化
pthread_mutexattr_init (&mutexattr);
pthread_mutexattr_settype (&mutexattr, PTHREAD_MUTEX_TIMED_NP);//快速互斥锁
No.3:线程一:
if (pthread_mutex_lock (&mutex) < 0) {perror}
进行操作内容
if (pthread_mutex_unlock (&mutex) < 0) {perror}
No.4:线程二:
ret = pthread_mutex_trylock (&mutex);if (ret == EBUSY){perror}
进行操作内容
if (pthread_mutex_unlock (&mutex) != 0) {perror}
No.5:
pthread_mutex_destroy (&mutex);
-------------------------------------------------------------------------------------------------------------