POSIX线程
基础函数
- pthread_create用于创建一个线程。
- pthread_t
*tid
:线程id的类型为pthread_t,通常为无符号整型,当调用pthread_create成功时,通过*tid
指针返回。 - const pthread_attr_t
*attr
:指定创建线程的属性,如线程优先级、初始栈大小、是否为守护进程。通过使用NULL作为默认值。 - void
*(*func)(void *)
:函数指针func,指定当新的线程创建之后,将执行的函数。 - void
*arg
:线程将执行的函数的参数。
- pthread_t
int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func) (void *), void *arg);
- pthread_join用于等待某个线程退出
- pthread_t tid:指定要等待的线程ID
- void **status:如果不为NULL,那么线程的返回值存储在status指向的空间
int pthread_join (pthread_t tid, void ** status);
- pthread_self用于返回当前线程的ID
pthread_t pthread_self (void);
- pthread_detach用于指定线程变为分离状态。变为分离状态的线程,如果线程退出,它的所有资源将全部释放。
int pthread_detach (pthread_t tid);
- pthread_exit用于终止线程,可以指定返回值,以便其他线程通过pthread_join函数获取线程的返回值。
- void *status:指针线程终止的返回值
void pthread_exit (void *status);
互斥同步
- pthread_mutex_lock用于临界资源加锁&pthread_mutex_unlock用于临界资源解锁
- pthread_mutex_t *mptr:pthread_mutex_t类型的变量
int pthread_mutex_lock(pthread_mutex_t * mptr);
int pthread_mutex_unlock(pthread_mutex_t * mptr);
- pthread_cond_wait用于阻塞当前线程(pthread_cond_timedwait限定阻塞时间)
- pthread_cond_signal/pthread_cond_broadcast用于唤醒一个线程或者全部线程,需要配合pthread_mutex_lock锁的使用。
int pthread_cond_wait(pthread_cond_t *cptr, pthread_mutex_t *mptr);
int pthread_cond_timedwait (pthread_cond_t * cptr, pthread_mutex_t *mptr, const struct timespec *abstime);
int pthread_cond_signal(pthread_cond_t *cptr);
int pthread_cond_broadcast (pthread_cond_t * cptr);
例子(使用互斥同步)
代码含义:当x<=y时自动挂起thread1,thread2执行修改x、y值使得x>y自动唤醒thread2。
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<errno.h>
#include<unistd.h>
typedef void* (*fun)(void*);
int x=1, y = 2;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void* thread1(void*);
void* thread2(void*);
int main(int argc, char** argv)
{
printf("enter main\n");
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, thread1, NULL);
pthread_create(&tid2, NULL, thread2, NULL);
//等待所有线程结束
pthread_join(tid2, NULL);
printf("leave main\n");
exit(0);
}
void* thread1(void* arg)
{
printf("enter thread1\n");
pthread_mutex_lock(&mutex);
if (x <= y) {
printf("x比y小,等待条件符合\n");
pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);
printf("leave thread1\n");
pthread_exit(0);
}
void* thread2(void* arg)
{
printf("enter thread2\n");
pthread_mutex_lock(&mutex);
// 更改x值使得 x>y 并唤醒thread1
x = 3;
if (x > y) {
printf("x比y大,唤醒thread1\n");
pthread_cond_signal(&cond);
}
pthread_mutex_unlock(&mutex);
printf("leave thread2\n");
pthread_exit(0);
}
执行后的结果:
enter main
enter thread1
enter thread2
x比y小,等待条件符合
x比y大,唤醒thread1
leave thread2
leave thread1
leave main