您现在的位置是:首页 > 技术文章网站首页技术文章

[C++]多线程

  • WangYe
  • 2020-08-03 21:00:20
  • 438 次阅读
了解C++中的多线程。

多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序;

两种类型的多任务处理

    1. 基于进程的多任务处理是程序的并发执行;

    2. 基于线程的多任务处理是同一程序的片段并发执行;

这样的程序中每个部分都称为一个线程,每个线程定义了一个单独的执行路径;


创建线程

#include <pthread.h>
pthread_create(thread,attr,start_routine,arg);    //创建一个新线程

参数:
    thread:指向线程标识符指针
    attr:一个不透明属性对象,可以被用来设置线程熟悉,也可以使用默认值NULL
    start_routine:线程运行函数起始地址,创建线程会被执行
    arg:运行函数的参数。它必须通过把引用作为强制转换为void类型进行传递,没有传递则使用NULL

创建线程成功时,函数返回0,若返回值不为0则说明线程创建失败;

终止线程

#include <pthread.h>
pthread_exit(status);    //退出线程


实例001

#include <iostream>
#include <pthread.h>    //必须的头文件
using namespace std;
#define NUM_THREADS 5

//线程的运行函数
void* say_hello(void* args)
{
    cout << "Hello Runoob!" << endl;
    
    return 0;
}
int main()
{
    //定义线程的id变量,多个变量使用数组
    pthread_t tids[NUM_THREADS];
    for(int i=0;i<NUM_THREADS;i++)
    {
        //创建的线程id,线程参数,调用的函数,传入的函数参数
        int ret = pthread_create(&tids[i],NULL,say_hello,NULL);
        if(ret != 0)
        {
            cout << "pthread_create error : error_code =" << ret << endl;
        }
    }
    //等各个线程退出后,进程才结束,否则强制结束线程可能没反应过来
    pthread_exit(NULL);
}

编译:g++ -o 001 001.cpp -pthread

输出结果:

Hello Runoob!
Hello Runoob!
Hello Runoob!
Hello Runoob!
Hello Runoob!

实例002

使用 pthread_create() 函数创建了 5 个线程,并接收传入的参数。每个线程打印一个 "Hello Runoob!" 消息,并输出接收的参数,然后调用 pthread_exit() 终止线程。

#include <iostream>
#include <cstdlib>
#include <pthread.h>
using namespace std;

#define NUM_THREADS 5

void *PrintHello(void *threadid)
{
    //对传入参数进行强制类型转换,由无类型指针变为整形数指针,然后再读取
    int tid = *((int*)threadid);
    cout << "Hello Runoob ! 线程 ID," << tid << endl;
    pthread_exit(NULL);
}

int main()
{
    pthread_t threads[NUM_THREADS];
    int indexes[NUM_THREADS];  //用数组来保存i的值
    int rc;
    int i;
    for(i=0;i<NUM_THREADS;i++)
    {
        cout << "main():创建线程," << i << endl;
        indexes[i] = i; //先保存i的值
        //传入的时候必须强制转换为void* 类型,既无类型指针
        rc = pthread_create(&threads[i],NULL,PrintHello,(void *)&(indexes[i]));

        if(rc)
        {
            cout << "Error:无法创建线程," << rc << endl;
            exit(-1);
        }
    }
    pthread_exit(NULL);
}

编译:

g++ test.cpp -lpthread -o test.o

图片.png


向线程传递参数

通过结构传递多个参数,在线程回调中传递任意数据类型因为它指向void:

#include <iostream>
#include <cstdlib>
#include <pthread.h>

using namespace std;

#define NUM_THREADS 5

struct thread_data{
    int thread_id;
    char *message;
};

void *PrintHello(void *threadarg)
{
    struct thread_data *my_data;
    
    my_data = (struct thread_data *) threadarg;
    
    cout << "Thread ID :" << my_data->thread_id;
    cout << "Message :" << my_data->message << endl;
    
    pthread_exit(NULL);
}

int main()
{
    pthread_t threads[NUM_THREADS];
    struct thread_data td[NUM_THREADS];
    int rc;
    int i;
    
    for(i=0;i<NUM_THREADS;i++)
    {
        cout << "main() : creating thread," << endl;
        td[i].thread_id = i;
        td[i].message = (char*)"This is message";
        rc = pthread_create(&threads[i],NULL,PrintHello,(void *)&td[i]);
        
        if(rc)
        {
            cout << "Error:unable to create thread," << rc << endl;
            exit(-1);
        }
    }
    pthread_exit(NULL);
}

编译:

g++ Wno-write-strings test.cpp -lpthread -o test.o
main() : creating thread, 0
main() : creating thread, 1
Thread ID : 0 Message : This is message
main() : creating thread, Thread ID : 21
 Message : This is message
main() : creating thread, 3
Thread ID : 2 Message : This is message
main() : creating thread, 4
Thread ID : 3 Message : This is message
Thread ID : 4 Message : This is message



连接和分离线程

可以使用以下两函数:

pthread_join(threadid,status);
pthread_detach(threadid);

pthread_join() 子程序阻碍调用程序,直到指定的 threadid 线程终止为止。当创建一个线程时,它的某个属性会定义它是否是可连接的(joinable)或可分离的(detached)。只有创建时定义为可连接的线程才可以被连接。如果线程创建时被定义为可分离的,则它永远也不能被连接。

这个实例演示了如何使用 pthread_join() 函数来等待线程的完成。

#include <iostream>
#include <cstdlib>
#include <pthread.h>
#include <unistd.h>
using namespace std;

#define NUM_THREADS 5

void *wait(void *t)
{
    int i;
    long tid;

    tid = (long)t;

    sleep(1);
    cout << " Sleeping in thread " << endl;
    cout << " Thread with id : " << tid << " ...exiting" << endl;
    pthread_exit(NULL);
}

int main()
{
    int rc;
    int i;
    pthread_t threads[NUM_THREADS];
    pthread_attr_t attr;
    void *status;

    //初始化并设置线程为可连接(joinable)
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);

    for(i=0;i<NUM_THREADS;i++)
    {
        cout << "main() : creating thread, " << i << endl;
        rc = pthread_create(&threads[i],NULL,wait,(void *)&i);
        if(rc){
            cout << " Error:unable to create thread, " << rc << endl;
            exit(-1);
        }
    }
    //删除属性,并等待其它线程
    pthread_attr_destroy(&attr);
    for(i=0;i<NUM_THREADS;i++)
    {
        rc = pthread_join(threads[i],&status);
        if(rc)
        {
            cout << " Error:unable to join , " << rc << endl;
            exit(-1);
        }
        cout << " Main: completed thread id : " << i;
        cout << " exiting with status : " << status << endl;
    }
    cout <<"Main : program exiting." << endl;
    pthread_exit(NULL);
}

编译:

g++ -o join_detach join_detach.cpp -pthread

输出结果:

图片.png

TAG: C++ 多线程

上一篇:[C++]动态内存

下一篇:[C++]认识STL 2

文章评论 (0)



Top