c语言 使用多线程

简介: c语言 使用多线程

头文件

#include<pthread.h>

函数声明

1

2

int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,

void *(*start_rtn)(void*),void *arg);

返回值

若线程创建成功,则返回0。若线程创建失败,则返回出错编号,并且*thread中的内容是未定义的。

返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于指定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。

参数

第一个参数为指向线程标识符指针

第二个参数用来设置线程属性。

第三个参数是线程运行函数的起始地址。

最后一个参数是运行函数的参数。

传参数

1.传多个参数:封装成结构体

typedef struct args{
    int id;
    char * name;
} ARGS;
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include "log.h"
#include "test.h"
 
int * thread(void * arg)
{
    pthread_t newthid;
    ARGS *args = (ARGS *)arg;
    newthid = pthread_self();
    LOGI(LOG_TAG,"this is a new thread, args->id = %d\n", args->id);
    LOGI(LOG_TAG,"this is a new thread, args->name = %s\n", args->name);
    return 0;
}
 
int main(void)
{
    pthread_t thid;
 
    LOGI(LOG_TAG,"main thread ,ID is %ld\n",pthread_self());
    ARGS *args;
    args->id = 10;
    args->name ="test";
    //int j=10;
    if(pthread_create(&thid, NULL, thread, args) != 0) {
        LOGI(LOG_TAG,"thread creation failed\n");
    }
}
I/jniTest: this is a new thread, args->id = 10
I/jniTest: this is a new thread, args->name = test

2.传单个参数

int * thread(void * arg)
{
    pthread_t newthid;
 
    newthid = pthread_self();
    int j = (int *)arg;
    LOGI(LOG_TAG,"this is a new thread, j = %d\n", j);
    return 0;
}
 
int main(void)
{
    pthread_t thid;
 
    LOGI(LOG_TAG,"main thread ,ID is %ld\n",pthread_self());
 
    int j=10;
    if(pthread_create(&thid, NULL, thread, j) != 0) {
        LOGI(LOG_TAG,"thread creation failed\n");
    }
}
int * thread(void * arg)
{
    pthread_t newthid;
 
    newthid = pthread_self();
    char* j = (char *)arg;
    LOGI(LOG_TAG,"this is a new thread, j = %s\n", j);
    return 0;
}
 
int main(void)
{
    pthread_t thid;
 
    LOGI(LOG_TAG,"main thread ,ID is %ld\n",pthread_self());
 
    char *j="10";
    if(pthread_create(&thid, NULL, thread, j) != 0) {
        LOGI(LOG_TAG,"thread creation failed\n");
    }
}

3.不传参数

pthread_create(&thid, NULL, thread, NULL)


目录
相关文章
|
4天前
|
算法 安全 C语言
【C 言专栏】C 语言中的多线程编程
【5月更文挑战第5天】本文探讨了C语言中的多线程编程,包括多线程概念、通过POSIX线程库和Windows线程库的实现方式、基本步骤(创建、执行、同步、销毁线程)、线程同步机制(互斥锁、条件变量、信号量)以及优点(提高性能、增强并发处理、改善用户体验)。同时,文章指出多线程编程面临的挑战如线程安全、死锁和资源竞争,并提及内存管理问题。通过案例分析和展望未来趋势,强调了掌握多线程编程在提升程序效率和应对复杂任务中的重要性。
【C 言专栏】C 语言中的多线程编程
|
4天前
|
消息中间件 Java Linux
C语言-线程池代码
github 地址:常用的C工具代码,这里的工具包含了C语言实现的线程池,hashtable,list,md5,字符串操作,消息队列等很多常用的工具,我这里就不一一说明了,感兴趣的朋友可以自行下载研究,工作中肯定用的上。
40 0
|
6月前
|
安全 Java C语言
C语言线程解池解读和实现01
在说到并发,池式组件的时候,最先想到的肯定是线程池。那线程池的原理是什么呢,又是如何工作的呢?这篇文章告诉你答案。
|
6月前
|
Java C语言
基于C语言 -- 线程池实现
基于C语言 -- 线程池实现
34 0
|
11月前
|
算法 C语言
C语言实现多线程
C语言实现多线程
181 0
|
Linux C语言
小白初识linux下的C语言多线程
小白初识linux下的C语言多线程
|
存储 安全 Java
【C语言安全编码之可重入函数】2、线程安全
【C语言安全编码之可重入函数】2、线程安全
234 0
【C语言安全编码之可重入函数】2、线程安全
|
自然语言处理 Linux C语言
【C语言有什么用?②】制作一个多线程词频统计工具
【C语言有什么用?②】制作一个多线程词频统计工具
【C语言有什么用?②】制作一个多线程词频统计工具
|
存储 安全 C语言
【C 语言】字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序字符串操作 | 引入线程安全概念 )
【C 语言】字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序字符串操作 | 引入线程安全概念 )
89 0
【C 语言】字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序字符串操作 | 引入线程安全概念 )