线程的创建、等待、退出

多线程开发在Linux平台上已经有成熟的pthread库支持,所以使用pthread库在编译时要加上-pthread。其设计的多线程开发的基本概念主要包含3点:线程、互斥锁、条件。其中线程操作又分线程的创建、退出、等待三种。互斥锁包含4种操作,分别是创建、销毁、加锁和解锁。条件操作有5种,分别是“创建、销毁、触发、广播和等待。

更详细的讲解可以看以下的连接:https://www.cnblogs.com/xiehongfeng100/p/4620852.html

线程创建

函数原型

int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);

参数

pthread_t *restrict tidp:新线程的ID。需要注意的是使用pthread_t定义的变量是unsigned int型,传参的时候要进行类型转换。

pthread_attr_t *restrict attr:线程的属性。可以暂时把它设置为NULL,创建默认属性的线程。

void *(*start_rtn)(void *arg):线程创建需要执行的任务函数。新创建的线程从start_rtn函数的地址开始运行。该函数只有一个无类型指针arg。如果需要start_rtn函数传递的参数不止一个,那么需要将这些参数放入一个结构体中,然后把这个结构体的地址作为arg参数传入。

返回值

创建函数成功返回0,失败返回错误编号。

示例

#include <stdio.h>
#include <pthread.h>
void *func1(void *arg)
{
        printf("t1:%ld thread is creart\n",(unsigned long)pthread_self());
        printf("t1:param is %d\n",*((int *)arg));
}
int main()
{
        int param=100;
        int ret;
        pthread_t t1;
        ret=pthread_create(&t1, NULL,func1, (void *)&param);
        if(ret == 0)
        {
                printf("main:create t1 successed\n");
        }


        printf("main:%ld\n",(unsigned long)pthread_self());
        while(1);

        return 0;
}
        

 线程等待

调用这个函数的线程将一直阻塞,直到指定的此案成调用pthread_exit,从启动例程中返回或被取消。如果例程只是从他的启动例程返回i,rval_ptr将包含返回码。如果线程被取消,由rval_ptr指定的内存单元就置为PTHREAD_CANCELED。

可以通过掉用pthread_join自动把线程职位分离状态,这样资源就可以回复。如果线程已经处于分离状态,pthread_join调用就会失败,返回EINVAL。

如果对线程的返回值不感兴趣,可以把rval_ptr置为NULL。在这种情况下,调用pthread_join函数将等待指定的线程终止,但并不获得线程的终止状态。

函数原型

int pthread_join(pthread_t thread, rval_ptr);

参数

pthread_t thread:线程ID

void **rval_ptr:线程收回或被取消的状态等信息

返回值

若成功返回0,否则返回错误编号

线程退出

单个线程可以通过以下三种方式退出,在不终止整个进程的情况下停止它的控制流

  1. 线程只是从启动例程中返回,返回值是
  2. 线程可以被统一进程中的其他线程取消
  3. 线程调用pthread_exit;

函数原型

int pthread_exit(void *rval_ptr);

参数

void *rval_ptr:是一个无类型指针,与传给启动例程的单个参数类似。进程中的其他线程可以通过pthread_join函数访问到这个指针。

返回值

线程的退出码

示例

#include <stdio.h>
#include <pthread.h>
void *func1(void *arg)
{
        static int ret=10;
        printf("t1:%ld thread is creart\n",(unsigned long)pthread_self());
        printf("t1:param is %d\n",*((int *)arg));
        pthread_exit((void *)&ret);

}
int main()
{
        int param=100;
        int *pret;
        int ret;
        pthread_t t1;

        ret=pthread_create(&t1, NULL,func1, (void *)&param);
        if(ret == 0)
        {
                printf("main:create t1 successed\n");
        }


        printf("main:%ld\n",(unsigned long)pthread_self());

        pthread_join(t1,(void **)&pret);
        printf("main: ti quit:%d\n",*pret);
        return 0;
}

除了可以传递整型变量,也可以传字符串等其他类型变量,但是需要注意的是,使用pthread_exit函数返回的变量要用static进行声明,不然传递的数据会出错。

#include <stdio.h>
#include <pthread.h>
void *func1(void *arg)
{
        static int ret=10;
        static char *p="t1 is run out";
        printf("t1:%ld thread is creart\n",(unsigned long)pthread_self());
        printf("t1:param is %d\n",*((int *)arg));
        pthread_exit((void *)p);

}
int main()
{
        int param=100;
        char *pret=NULL;
        int ret;
        pthread_t t1;

        ret=pthread_create(&t1, NULL,func1, (void *)&param);
        if(ret == 0)
        {
                printf("main:create t1 successed\n");
        }


        printf("main:%ld\n",(unsigned long)pthread_self());

        pthread_join(t1,(void **)&pret);
        printf("main: ti quit:%s\n",pret);
        return 0;
}

线程ID获取

  对于线程ID比较,为了可移植操作,我们不能简单地把线程ID当作整数来处理,因为不同系统对线程ID的定义可能不一样。

函数原型

pthread_t pthread_self(void);

返回值

调用线程的ID

线程ID比较

函数原型

int pthread_equal(pthread_t tid1, pthread_t tid2);

返回值

若相等则返回非0值,否则返回0

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,如果您想在 Delphi 中创建一个线程等待一段时间后结束,您可以尝试以下代码: ```delphi unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TMyThread = class(TThread) private FWaitTime: Integer; protected procedure Execute; override; public constructor Create(AWaitTime: Integer); end; TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} constructor TMyThread.Create(AWaitTime: Integer); begin inherited Create(True); FWaitTime := AWaitTime; end; procedure TMyThread.Execute; begin Sleep(FWaitTime); end; procedure TForm1.Button1Click(Sender: TObject); var MyThread: TMyThread; begin MyThread := TMyThread.Create(3000); // 创建一个等待 3 秒的线程 try MyThread.Start; // 启动线程 MyThread.WaitFor; // 等待线程结束 Memo1.Lines.Add('Thread finished.'); finally MyThread.Free; end; end; end. ``` 在上面的代码中,我们首先定义了一个 `TMyThread` 类,继承自 `TThread`。在 `TMyThread` 类中,我们新增了一个私有属性 `FWaitTime`,表示线程等待的时间。在 `TMyThread.Create` 构造函数中,我们传入等待时间,然后调用父类的构造函数来创建线程对象。 在 `TMyThread.Execute` 方法中,我们调用 `Sleep(FWaitTime)` 来使线程等待指定的时间。在 `TForm1.Button1Click` 事件中,我们创建了一个 `TMyThread` 对象,并传入等待 3 秒的时间。然后调用 `MyThread.Start` 方法来启动线程,并在启动后调用 `MyThread.WaitFor` 方法来等待线程结束。最后在 `finally` 块中释放线程对象。 当线程结束后,会自动调用 `TMyThread.Execute` 方法并退出,此时我们在主线程中就可以得到线程结束的通知,然后在 `Memo1` 控件上添加一条提示信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值