📜  C / C++中的线程函数

📅  最后修改于: 2021-05-25 22:19:23             🧑  作者: Mango

Unix / Linux操作系统中C / C++语言为所有与线程相关的功能提供POSIX线程(pthread)标准API(应用程序接口)。它允许我们为并发流程创建多个线程。它在多处理器或多核系统上最有效,在多系统或多核系统中,可以在内核级别实现线程以实现执行速度。通过利用IO或其他可能导致进程中断的系统功能中的延迟,也可以在单处理器系统中找到收益。

我们必须在脚本的开头包含pthread.h头文件,才能使用pthreads库的所有功能。要执行c文件,我们在编译文件时必须在命令行中使用-pthread或-lpthread。

cc -pthread file.c or
cc -lpthread file.c

并行线程库中定义的功能包括:

  1. pthread_create:用于创建新线程

    句法:

    int pthread_create(pthread_t * thread, 
                       const pthread_attr_t * attr, 
                       void * (*start_routine)(void *), 
                       void *arg);
    

    参数:

    • thread:指向无符号整数值的指针,该整数值返回创建的线程的线程ID。
    • attr:指向用于定义线程属性(如分离状态,调度策略,堆栈地址等)的结构的指针。对于默认线程属性,设置为NULL。
    • start_routine:指向线程执行的子例程的指针。子例程的返回类型和参数类型必须为void *。该函数具有单个属性,但是如果需要将多个值传递给该函数,则必须使用结构。
    • arg:指向void的指针,该指针包含先前参数中定义的函数的参数
  2. pthread_exit:用于终止线程

    句法:

    void pthread_exit(void *retval);
    

    参数:此方法接受强制参数retval ,该参数是指向存储终止线程的返回状态的整数的指针。此变量的范围必须是全局的,以便任何等待加入该线程的线程都可以读取返回状态。

  3. pthread_join:用于等待线程终止。

    句法:

    int pthread_join(pthread_t th, 
                     void **thread_return);
    

    参数:此方法接受以下参数:

    • th:当前线程正在等待的线程的线程ID。
    • thread_return:指向th中提到的线程的退出状态存储位置的指针。
  4. pthread_self:用于获取当前线程的线程ID。

    句法:

    pthread_t pthread_self(void);
    
  5. pthread_equal:比较两个线程是否相同。如果两个线程相等,则该函数返回一个非零值,否则返回零。

    句法:

    int pthread_equal(pthread_t t1, 
                      pthread_t t2);
    

    参数:此方法接受以下参数:

    • t1:第一个线程的线程ID
    • t2:第二个线程的线程ID
  6. pthread_cancel:用于向线程发送取消请求

    句法:

    int pthread_cancel(pthread_t thread);
    

    参数:此方法接受强制性参数线程,该线程是向其发送取消请求的线程的线程ID。

  7. pthread_detach:用于分离线程。分离的线程不需要在终止时加入线程。如果线程是分离的,则在终止线程后,线程的资源会自动释放。

    句法:

    int pthread_detach(pthread_t thread);
    

    参数:此方法接受必需的参数线程,该线程是必须分离的线程的线程ID。

示例:线程的简单实现如下:

// C program to show thread functions
  
#include 
#include 
#include 
  
void* func(void* arg)
{
    // detach the current thread
    // from the calling thread
    pthread_detach(pthread_self());
  
    printf("Inside the thread\n");
  
    // exit the current thread
    pthread_exit(NULL);
}
  
void fun()
{
    pthread_t ptid;
  
    // Creating a new thread
    pthread_create(&ptid, NULL, &func, NULL);
    printf("This line may be printed"
           " before thread terminates\n");
  
    // The following line terminates
    // the thread manually
    // pthread_cancel(ptid);
  
    // Compare the two threads created
    if(pthread_equal(ptid, pthread_self())
        printf("Threads are equal\n");
    else
        printf("Threads are not equal\n");
  
    // Waiting for the created thread to terminate
    pthread_join(ptid, NULL);
  
    printf("This line will be printed"
           " after thread ends\n");
  
    pthread_exit(NULL);
}
  
// Driver code
int main()
{
    fun();
    return 0;
}

输出:

This line may be printed before thread terminates
Threads are not equal
Inside the thread
This line will be printed after thread ends

说明:这里在代码中创建了两个执行线程。取决于先前处理的线程,两个线程的输出线的顺序可以互换。主线程等待新创建的线程退出。因此,仅在新线程退出后才输出输出的最后一行。通过不使用pthread_join函数,线程可以彼此独立终止。如果我们想手动终止新线程,可以使用pthread_cancel来完成。

注意:如果我们使用exit()而不是pthread_exit()结束线程,则即使某些线程可能仍在运行,带有所有关联线程的整个过程也会终止。

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。