MENU

POSIX线程

基础函数

  • pthread_create用于创建一个线程。
    • pthread_t *tid:线程id的类型为pthread_t,通常为无符号整型,当调用pthread_create成功时,通过*tid指针返回。
    • const pthread_attr_t *attr:指定创建线程的属性,如线程优先级、初始栈大小、是否为守护进程。通过使用NULL作为默认值。
    • void *(*func)(void *):函数指针func,指定当新的线程创建之后,将执行的函数。
    • void *arg:线程将执行的函数的参数。
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
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码