C语言用pthread.h创建线程

C语言的线程库

  • 在Linux系统上,可使用pthread.h的API创建线程。比如pthread_create()。

    • pthread.h符合POSIX标准,适用于类Unix、Linux系统。也有兼容Windows的版本——pthreads-w32。
    • 编译时要链接pthread库,比如:gcc test.c -o test -l pthread
  • C11制定了一个标准的线程库threads.h,但部分编译器不支持它。

pthread.h的API

官方API列表:https://www.sourceware.org/pthreads-win32/manual/index.html
这里列出几个常用API:

pthread_t	// 一种数据类型,用于存储线程ID

int pthread_create(pthread_t *id,				// 传入一个pthread_t类型的变量的地址
				   const pthread_attr_t * attr,	// 传入线程的属性(传入NULL则是默认属性)
				   void *(*) (void *),			// 传入要运行的函数名
				   void *arg);					// 传入要运行的函数的参数(没有参数则填NULL,有多个则封装成一个结构体)
	功能:创建一个线程来运行一个函数。
	线程创建成功后会将该线程的ID存储到变量id中,并返回0。线程创建失败时会返回非零值。
	要运行的函数应该定义成 void *fun(void *arg) 的格式。

int pthread_join(pthread_t id, void **retval);
	功能:暂停当前线程的运行,等待id所指的线程终止。当它终止之后,其返回值会存储在retval变量中。

int pthread_cancel(pthread_t id);
	功能:向某个线程发送取消请求,请它结束运行。
	目标线程可能立即终止,也可能稍后终止,也可能忽略取消请求。

pthread.h的示例

这里创建两个线程,分别运行两个函数:

#include <stdio.h>
#include <pthread.h>

void *fun1(){		// 没有参数
    puts("fun1() end.");	// 显示一些信息,便于判断多个线程的结束顺序
    return 0;
}

typedef struct{
    int age;
    char name[10];
} Horse;

void *fun2(void *p){	// 用一个结构体传入参数
    Horse h = *(Horse *)p;
    printf("age: %d, name: %s.\n", h.age, h.name);
    puts("fun2() end.");
    return 0;
}

int main(){
    int rc;
    pthread_t id;

    // 创建第一个线程
    rc = pthread_create(&id, NULL, fun1, NULL);
    if (rc)
        puts("Failed to create the thread fun1().");

    // 创建第二个线程
    Horse horse = {5, "Jack"};
    rc = pthread_create(&id, NULL, fun2, &horse);
    if (rc)
        puts("Failed to create the thread fun2().");

    // 阻塞主线程的运行,以免主线程运行结束时提前终止子线程
    pthread_join(id, NULL);
    puts("main() end.");
    return 0;
}

编译运行:
在这里插入图片描述

  • 12
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值