线程的创建

一、线程创建的关键细节

1.pthread_create 参数

  • 第一个参数:指向线程标识符的指针

  • 第二个参数:设置线程属性,nullptr表示默认

  • 第三个参数:线程函数地址

  • 第四个参数:传递给线程函数的参数

2.参数传递最佳实践

  • 使用结构体封装线程数据

  • 动态分配内存传递参数

  • 使用智能指针管理资源所有权

3. 线程生命周期管理

  • pthread_join:阻塞等待线程结束

  • pthread_detach:分离线程,系统自动回收资源

  • 必须选择其中一种方式,避免僵尸线程

 4.错误检查

  • 检查 pthread_create 返回值

  • 非零表示创建失败

二、代码实现 

 1.源代码:

#include
#include
#include
#include

void *threadrun(void *args)
{
    std::string name = (const char *)args;
    while(true)
    {
        std::cout<<"我是新线程: name: " << name<

1.1用C++实现: 

#include
#include
#include
#include
#include

//用C++来实现线程

void hello()
{
    while(true)
    {
        std::cout<<"新进程: Hello world! "<

执行结果:

线程的创建_第1张图片 

2.makefile :

 由于不可以调用系统,所以要使用第三方库(第三方库要使用-l) -lpthrerad

testThread:testThread.cc
	g++ -o $@ $^ -std=c++11 -lpthread
.PHONY:clean
clean:
	rm -f testThread

 三、代码监控

  • 现在可以看到 ./testThread 正在运行(STAT 为 Sl+

  • 进程 PID 为 997229,父进程 PPID 为 990769

 线程的创建_第2张图片

LWP(轻量级进程)

cpu调度的时候看的是lwp,因为Linux中只有轻量级进程

 四、取消线程的方法线程的创建_第3张图片五、创建多线程

1.代码实现: 

#include
#include
#include
#include
#include

const int num = 10;

void *routine(void *args)
{
    sleep(1);
    std::string name = static_cast(args);
    delete (char*)args;
    
    int cnt = 5;
    while (cnt--)
    {
        std::cout<<"新线程name: "< tids;
    for(int i = 0; i < num; i++)
    {
        pthread_t tid;
        char *id = new char[64];
        snprintf(id, 64, "thread - %d", i);

        int n = pthread_create(&tid, nullptr, routine, id);
        if(n == 0)
            tids.push_back(tid);
        else 
            continue;
    }
    //一个一个的进程等待
    for (int i = 0; i < num; i++)
    {
        int n = pthread_join(tids[i], nullptr);
        if(n == 0)
            std::cout<<"等待新进程成功!!"<

1. main函数结束,代表主线程结束,一般也代表进程结束。

2. 新线程对应的入口函数,运行结束,代表当前线程运行结束。

3. 一个问题:给线程传递的参数和返回值,可以是任意类型(包括对象)。

 

你可能感兴趣的:(语法,java,jvm,开发语言)