七、Linux--共享内存

    xiaoxiao2021-12-14  43

    1 pthread_create()

    #include<pthread.h>

    int pthread_create(pthread_t  *tidp,  const pthread_attr_t  *attr,

    (void*)   (*start_rtn)(void*),  void   *arg  );

    编译链接参数

    -pthread

    返回值

    若线程创建成功,则返回0

    若线程创建失败,则返回出错编号,并且*thread中的内容是未定义的。

    返回成功时,由tidp指向的内存单元被设置为新创建线程的线程IDattr参数用于指定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个构的地址作为arg的参数传入。

    参数

     

    第一个参数为指向线程标识符的指针。

    第二个参数用来设置线程属性。(一般设置为NULL表示默认属性)

    第三个参数是线程运行函数的起始地址。

    最后一个参数是运行函数的参数。

    注意事项

    因为pthread并非Linux系统的默认库,而是POSIX线程库。在Linux中将其作为一个库来使用,因此加上 -lpthread(或-pthread)以显式链接该库。函数在执行错误时的错误信息将作为返回值返回,并不修改系统全局变量errno,当然也无法使用perror()打印错误信息。

    例:

    #include <stdio.h>

    #include <stdlib.h>

    #include <pthread.h>

    #include <unistd.h>

    #include <string.h>

     

    void printids(const char *s)

    {

        pid_t pid;

        pthread_t tid;

        pid = getpid();

        tid = pthread_self();

        printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int) pid,

                (unsigned int) tid, (unsigned int) tid);

    }

     

    void *thr_fn(void *arg)

    {

        printids("new thread: ");

        return NULL;

    }

     

    int main(void)

    {

        int err;

        pthread_t ntid;

        err = pthread_create(&ntid, NULL, thr_fn, NULL);

        if (err != 0)

            printf("can't create thread: %s\n", strerror(err));

        printids("main thread:");

        pthread_join(ntid,NULL);

        return EXIT_SUCCESS;

    }

    2 pthread_join()

     #include <pthread.h>

     int pthread_join(pthread_t  thread, void  **retval);

     

    功能

    pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。

    参数 

    thread: 线程标识符,即线程ID,标识唯一线程。

    retval用户定义的指针,用来存储被等待线程的返回值。(不关心时可以填NULL

    返回值  0代表成功。 失败,返回的则是错误号。

    3 pthread_mutex_init()

    #include <pthread.h>

    int pthread_mutex_init (pthread_mutex_t  *restrict        mutex,

    const pthread_mutexattr_t *restrict   attr);

    //restrict 表明参数attr必须是const pthread_mutexattr_t *类型的指,

    否则编译时就会报错

     注意

    pthread_mutex_t  mutex  =  PTHREAD_MUTEX_INITIALIZER;  //是以静态方式创建互斥锁,不需要使用pthread_mutex_init 初始化,但是只能在mutex变量定义的时候赋值常量PTHREAD_MUTEX_INITIALIZER,否则无效。

     

    mutex:互斥锁,使用pthread_mutex_t定义的变量,或者malloc一个出来。

    attr指定了新建互斥锁的属性。如果参数attrNULL,则使用默认的互斥锁属性,默认属性为快速互斥锁 。

    返回值:

    pthread_mutexattr_init()函数成功完成之后会返回零,其他任何返回值都表示出现了错误。函数成功执行后,互斥锁被初始化为未锁住态

    功能

    初始化互斥锁(pthread_mutex_t mutex定义了mutex变量就相当于创建了一个互斥锁)

    4 pthread_mutex_lock()

    #include <pthread.h>

    int pthread_mutex_lock(pthread_mutex_t  * mutex);

    返回值

    在成功完成之后会返回零。其他任何返回值都表示出现了错误。如果出现以下任一情况,该函数将失败并返回对应的值。

    描述

    线程调用该函数让互斥锁上锁,如果该互斥锁已被另一个线程锁定和拥有,则调用该线程将阻塞,直到该互斥锁解锁变为可用为止。

    如果互斥锁类型为 PTHREAD_MUTEX_NORMAL,则不提供死锁检测。尝试重新锁定互斥锁会导致死锁。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或未锁定,则将产生不确定的行为。

    如果互斥锁类型为 PTHREAD_MUTEX_ERRORCHECK,则会提供错误检查。如果某个线程尝试重新锁定的互斥锁已经由该线程锁定,则将返回错误。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或者未锁定,则将返回错误。

    如果互斥锁类型为 PTHREAD_MUTEX_RECURSIVE,则该互斥锁会保留锁定计数这一概念。线程首次成功获取互斥锁时,锁定计数会设置为 1。线程每重新锁定该互斥锁一次,锁定计数就增加 1。线程每解除锁定该互斥锁一次,锁定计数就减小 1。 锁定计数达到 时,该互斥锁即可供其他线程获取。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或者未锁定,则将返回错误。

    如果互斥锁类型是 PTHREAD_MUTEX_DEFAULT,则尝试以递归方式锁定该互斥锁将产生不确定的行为。对于不是由调用线程锁定的互斥锁,如果尝试解除对它的锁定,则会产生不确定的行为。如果尝试解除锁定尚未锁定的互斥锁,则会产生不确定的行为。

    5 pthread_mutex_unlock

    #include <pthread.h>

    int pthread_mutex_unlock(pthread_mutex_t *mutex);

    说明

    pthread_mutex_lock成对存在,释放互斥锁。

    6 pthread_cond_init()

    函数被用来初始化一个条件变量。

    #include <pthread.h>

    int  pthread_cond_init (pthread_cond_t *  restrict      cond,

    const pthread_condattr_t *restrict  attr)

    cond是一个指向结构pthread_cond_t的指针,

    attr是一个指向结构pthread_condattr_t的指针。

    结构pthread_condattr_t是条件变量的属性结构,和互斥锁一样我们可以用它来设置条件变量是进程内可用还是进程间可用,默认值是PTHREAD_ PROCESS_PRIVATE,即此条件变量被同一进程内的各个线程使用;如果选择为PTHREAD_PROCESS_SHARED则为多个进程间各线程公用。注意初始化条件变量只有未被使用时才能重新初始化或被释放。

    返回值:函数成功返回0;任何其他返回 值都表示错误。

    释放一个条件变量的函数为 pthread_cond_ destroy pthread_cond_t *cond )。 
    转载请注明原文地址: https://ju.6miu.com/read-969229.html

    最新回复(0)