C语言之简单使用pthread构建线程并运行
Posted 你是小KS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言之简单使用pthread构建线程并运行相关的知识,希望对你有一定的参考价值。
当前版本:eclipse c++
、MinGW-W64-builds-4.3.5
、widnwos
1. 声明
当前内容主要为使用C语言库pthread记录创建和使用线程的demo
2. 基本demo
#include <stdio.h>
#include <stdlib.h>
// 从unistd中导入sleep函数
#include<unistd.h>
// 导入需要使用的线程库
#include <pthread.h>
/**
* @description 当前内容主要为测试和使用线程,
* @author hy
* @createTime 2022-04-16
*/
void startThread(void *(*run)(void *), void *arg);
int shutdownNum = 1;
int modifyNum = 0; // 一个全局的共享变量
int defaultSleepTime = 200;
// 这里表示一个线程
void* run(void* arg)
// 得到当前执行的线程的执行id
pthread_t th = pthread_self();
printf("current execute thread id is %I64d\\n",th);
char* thread_name = NULL;
// 校验参数数量和参数个数
if (!arg || arg <= 0)
printf("exit with error!\\n");
shutdownNum--;
// 将参数的值进行赋值操作
pthread_exit("arg len <= 0");
else
thread_name = ((char**) arg)[0];
printf("start to printf info\\n");
fflush(stdout);
printf("thread name ==> %s\\n", thread_name);
fflush(stdout);
int num = 0;
// 执行5次打印就结束
while (num < 5)
modifyNum++;
printf("print %s : %d\\n", thread_name, ++num);
printf("print %s : modifyNum : %d\\n", thread_name, modifyNum);
fflush(stdout);
// 表示使用打印为1秒每次sleep(1);
_sleep(defaultSleepTime);//表示休眠200毫秒
printf("%s exit!\\n",thread_name);
fflush(stdout);
shutdownNum--;
pthread_exit("num >5");
return NULL;
int main(int argc, char **argv)
void *(*func)(void *) = run;
char* arg[2] = "thread-1" ;
void* args = arg; // 使用携带正确参数的可以执行,否则认为不可执行
printf("before create thread\\n");
startThread(func, args);
printf("after create thread\\n");
while (shutdownNum > 0)
printf("main thread wait! shutdownNum = %d\\n",shutdownNum);
fflush(stdout);
sleep(1);
printf("main thread shutdown!\\n");
printf("modifyNum = %d",modifyNum);
return 0;
// 表现为启动一个线程,给定一个函数和参数
void startThread(void *(*run)(void *), void *arg)
pthread_t th;
const pthread_attr_t *attr = NULL;
void *(*func)(void *) = run;
int result = pthread_create(&th, attr, func, arg);
if (result != 0)
// 表示无法创建该线程
printf("can't create thread in current application!");
exit(-1);
// 表现为join操作,即线程必定阻塞主线程执行,&res表示将返回结果拿到
//pthread_join(th, res);
这里主要为使用pthread_create创建一个线程,线程创建会自己启动(如果主线程没有退出),pthread_join表示直接阻塞主线程,pthread_exit表示让线程退出不再执行任务
输出结果:
3. 在编写和执行期间遇到的问题
在windows环境中并使用eclispse c++进行c的多线程代码执行中遇到的问题
printf没有作用
,eclipse不会在控制台打印输出,结果通过百度发现eclispe会将printf的数据放入缓冲区,所以需要调用fflush(stdout)
才会生效- 执行时发现如果main线程不进行等待,那么多线程程序一般不会被执行,所以程序代码中有让main线程等待的代码(可以使用pthread_join来阻塞main线程)
- 对于多个线程环境有并发问题(可以使用互斥锁解决)
以上是关于C语言之简单使用pthread构建线程并运行的主要内容,如果未能解决你的问题,请参考以下文章
多线程之pthread, NSThread, NSOperation, GCD
linux C语言 多线程竞争(加锁解锁 pthread_mutex_tpthread_mutex_lock()pthread_mutex_unlock() 可解决)