C语言是一种面向过程的编程语言,不像Java等高级语言内置了线程类和库。C语言通过调用操作系统提供的线程库来实现多线程编程。在C语言中,线程是进程内的执行单元,一个进程可以包含多个线程,它们共享进程的资源,但拥有独立的栈空间。
C语言中通常使用POSIX线程库(也称为pthread库)来进行多线程编程。POSIX线程库是一个跨平台的线程库,提供了创建、同步和销毁线程的函数。在Linux、macOS等UNIX-like系统中,该库已经内置,而在Windows系统中可以通过一些第三方库或者编译器特定的选项来支持。
创建一个线程就像定义一个函数一样,我们只需要搞清楚创建线程的四个参数:thread,attr,start_routine,arg,分别是什么,怎么用就足够。
#include //线程函数的头文件
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
thread:线程id,唯一标识一条线程
attr:设置为NULL
start_routine:线程的任务函数
arg:线程任务函数的参数
另外要强调的是:-pthread //使用线程函数时,需要链接这个库!!!
其实就是给线程一个取消请求,一般情况下,线程会默认收到取消请求。
int pthread_cancel(pthread_t thread);
下面是一个简单的例子,让我们更好的理解线程如何使用:
#include
#include
#include
// 线程共享全局变量
int g_a = 100;
void *task (void *arg)
{
while(1)
{
sleep(1);
printf("task....%s-->%d\n", (char *)arg, g_a);
}
}
// main本身就是一个线程
int main(void)
{
pthread_t tidA, tidB;
// 创建一条新的线程,新的线程所要执行的任务就是task所指向的函数里面的逻辑
pthread_create(&tidA, NULL, task, (void *)"A");
pthread_create(&tidB, NULL, task, (void *)"B");
// task(NULL);
while(1)
{
sleep(1);
printf("main....\n");
g_a++;
if(g_a == 110)
pthread_cancel(tidA); //给tidA线程发送一个取消请求
if(g_a == 115)
pthread_cancel(tidB); //给tidB线程发送一个取消请求
}
return 0;
}
这段C语言代码是一个简单的多线程示例,它展示了如何使用pthread库来创建和管理线程,并演示了线程之间共享全局变量的情况。
首先,全局变量g_a
被定义为整数类型并初始化为100。
task
函数是一个线程的执行体,它通过传递一个参数arg
来区分不同的线程。该函数使用无限循环(while循环),每隔一秒打印一次task....
并输出线程标识符("A"或"B")以及全局变量g_a
的值。
main
函数是程序的入口,也是主线程。它做了以下事情:
task
函数。线程tidA被标记为"A",线程tidB被标记为"B",通过传递参数给task
函数来区分它们。g_a
的值。g_a
的值等于110时,主线程发送一个取消请求给线程tidA,使得线程tidA会终止(退出)。g_a
的值等于115时,主线程发送一个取消请求给线程tidB,使得线程tidB会终止(退出)。需要注意的是,取消请求是一种请求终止线程的方式,但并不能保证线程会立即终止,具体是否终止取决于线程的处理逻辑。
更多C语言、Linux系统、ARM板实战和数据结构相关文章,关注专栏:
手撕C语言
玩转linux
脚踢数据结构
6818(ARM)开发板实战
一键三连喔
~