zoukankan      html  css  js  c++  java
  • 03多线程 ---- 多线程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更加安全有效。
  • 相关阅读:
    iOS项目之wifi局域网传输文件到iPhone的简单实现
    iOS项目之苹果审核被拒
    iOS项目之模拟请求数据
    nvm-window常用命令
    初探浏览器渲染原理
    node + mongodb 简单实现自己的查询接口
    快速理解_.debounce方法
    tr标签使用hover的box-shadow效果不生效
    一个简单的Node命令行程序:文件浏览
    打造丝般顺滑的 H5 翻页库(传送门)
  • 原文地址:https://www.cnblogs.com/vczf/p/11795623.html
Copyright © 2011-2022 走看看