多线程API

线程创建

#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
  • thread: 指向pthread_t结构类型的指针,用来和该线程交互
  •    attr:用于指定该线程相关属性,一般设置为NULL,使用默认属性
  •    start_routine:指定线程运行的函数,例如如果参数为int,返回int,那么应该是: int (*start_routine)(int)
  •    arg:指定线程函数的参数

线程完成

       #include <pthread.h>

       int pthread_join(pthread_t thread, void **retval);
  • thread: 指定需要等待的线程
  • retval:指向你希望得到的返回值

示例:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

void *mythread(void *arg)
{
        int m = (int)arg;
        printf("%d\n", m);
        return (void *)(arg + 1);
}

int main(int argc, char *argv[])
{
        pthread_t p;
        int rc, m;
        pthread_create(&p, NULL, mythread, (void *)100);
        pthread_join(p, (void **) &m);
        printf("returned %d\n", m);
        return 0;
}

结果:

[zf@localhost ch27]$ ./main
100
returned 101

pthread_mutex lock;
pthread_mutex_lock(&lock);
x=x+1;
pthread_mutex_unlock(&lock);

正常代码大概如上所示,pthread_mutex_lock调用时,如果没有其它线程持有该锁,则获取该锁,并进入临界区,如果另外线程持有,则等待。

注意:上面存在两个问题

第一个问题:lock未初始化

//两种方式
//1.锁设置为默认值
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

//2.动态初始化
int rc = pthread_mutex_init(&lock, NULL);
assert(rc == 0);

第二个问题:获取锁和释放锁未检查错误码

int rc = pthread_mutex_lock(&lock);
assert(rc == 0);

条件变量

//线程1
pthread_mutex_lock(&lock);
while (ready == 0)
    pthread_cond_wait(&cond, &lock);
pthread_mutex_unlock(&lock);

//线程2
pthread_mutex_lock(&lock);
ready = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);
pthread_cond_wait使线程1进入休眠,线程2发送信号,从而唤醒线程1,注意发出信号时,需要确保有锁。最后,使用while比if更加安全有效。

猜你喜欢

转载自www.cnblogs.com/vczf/p/11795623.html