Java中有许多线程操作。其中最底层的操作必然不是java自己实现的,而是对线程相关的系统调用的包装。尤其是各native方法。
接下来就探究一下Linux系统调用中,与线程相关的部分。
线程状态:执行中,阻塞,就绪
一、Linux线程相关系统调用
大类 | 作用 | 方法签名 |
---|---|---|
大类 | 作用 | 方法签名 |
线程 <pthread.h> | 创建一个新线程,且马上执行 | int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); |
| 等待指定线程结束,并获得返回值 | int pthread_join(pthread_t thread, void **value_ptr); |
| 结束当前线程,并返回一个值 | void pthread_exit(void *value_ptr); |
| 想另一个线程发送cancel信号。如何回应信号,由被取消的线程决定。 | int pthread_cancel(pthread_t thread); |
信号量(保证操作原子性) <semaphore.h> | 创建信号量 | int sem_init (sem_t *__sem, int __pshared, unsigned int __value) |
| 信号量+1,解除阻塞 | int sem_post(sem_t *sem); |
| 信号量-1,对值为0的信号量调用此方法将阻塞 | int sem_wait(sem_t *sem); |
| 信号量-1,对值为0的信号量调用此方法将返回错误 (上一个方法的非阻塞版本) | int sem_trywait(sem_t *sem); |
| 销毁信号量 | int sem_destroy(sem_t *sem); |
互斥量 <pthread.h> (信号量不光有0、1,还可以是别的数字;互斥量只能是lock和unlock两种状态) | 创建互斥量 | int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); |
| 互斥量加锁,若已经加锁,则阻塞 | 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); |