标签:wait har 线程 函数 code oca att 两种 变量
线程创建
#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
thread: 指向pthread_t结构类型的指针,用来和该线程交互
线程完成
#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更加安全有效。
标签:wait har 线程 函数 code oca att 两种 变量
原文地址:https://www.cnblogs.com/vczf/p/11795623.html