多线程API
Posted axianzZ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程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 ", 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 ", 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更加安全有效。
以上是关于多线程API的主要内容,如果未能解决你的问题,请参考以下文章