当前位置: 首页 > news >正文

网站建设与维护方案汕头百度网站排名

网站建设与维护方案,汕头百度网站排名,绍兴网站建设专业的公司,中英文外贸网站模版目录 一、线程概述 二、线程创建 三、线程终止 四、线程回收 五、线程取消 六、线程分离 七、线程安全 一、线程概述 线程是进程内的一个执行单元,是进程内可调度的实体。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空…

目录

一、线程概述

二、线程创建

三、线程终止

四、线程回收

五、线程取消 

六、线程分离

七、线程安全 


一、线程概述

线程是进程内的一个执行单元,是进程内可调度的实体。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间、文件描述符等,但拥有各自独立的程序计数器、栈和寄存器等执行上下文。线程相较于进程,创建和切换开销更小,能更有效地利用多核处理器资源,提高程序的并发性能。

二、线程创建

在 Linux 中,使用 pthread_create 函数来创建线程,其函数原型如下:

#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void*), void *arg);
  • thread:指向 pthread_t 类型的指针,用于存储新创建线程的标识符。
  • attr:指向 pthread_attr_t 类型的指针,用于设置线程的属性,若为 NULL,则使用默认属性。
  • start_routine:是一个函数指针,指向线程开始执行的函数,该函数返回值为 void* 类型,参数也为 void* 类型。
  • arg:传递给 start_routine 函数的参数。

示例代码:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>void *thread_function(void *arg) {// 线程函数,这里简单打印线程 ID 和传入的参数int num = *(int *)arg;printf("线程 ID:%lu,参数:%d\n", pthread_self(), num);pthread_exit(NULL);
}int main() {pthread_t thread_id;int num = 10;// 创建线程if (pthread_create(&thread_id, NULL, thread_function, (void *)&num)!= 0) {perror("线程创建失败");exit(EXIT_FAILURE);}// 主线程继续执行其他任务,这里简单睡眠一段时间sleep(2);// 等待线程结束(可选,这里只是为了确保线程在主线程退出前完成)pthread_join(thread_id, NULL);printf("主线程结束\n");return 0;
}

在上述代码中,首先定义了一个线程函数 thread_function,它接受一个 void* 类型的参数,并在线程中打印线程 ID 和传入的参数值。在 main 函数中,创建了一个线程,将 num 的地址作为参数传递给线程函数。主线程睡眠一段时间后,可以选择调用 pthread_join 等待子线程结束,确保子线程资源被正确回收后主线程再退出。 

三、线程终止

线程可以通过以下几种方式终止:

1.线程函数自然返回:线程函数执行完所有指令后返回,线程自动终止。

2.调用 pthread_exit 函数:线程可以在任何位置调用 pthread_exit 函数来显式终止自身,并可以返回一个指向线程退出状态的指针。

函数原型:void pthread_exit(void *retval);

示例代码:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>void *thread_function(void *arg) {// 线程执行一些任务后主动终止printf("线程即将终止\n");pthread_exit(NULL);
}int main() {pthread_t thread_id;// 创建线程if (pthread_create(&thread_id, NULL, thread_function, NULL)!= 0) {perror("线程创建失败");exit(EXIT_FAILURE);}// 等待线程结束(这里只是为了演示主线程的行为,实际上对于主动退出的线程,等待并非必需)pthread_join(thread_id, NULL);printf("主线程继续执行\n");return 0;
}

在上述代码中,线程函数 thread_function 执行到 pthread_exit(NULL) 时线程终止,主线程可以通过 pthread_join 来等待该线程结束,以确保线程资源被正确回收。

四、线程回收

pthread_join 函数用于回收已经终止的线程资源,并获取线程的退出状态(如果线程通过 pthread_exit 传递了退出状态)。

函数原型:int pthread_join(pthread_t thread, void **retval);

thread:要等待回收的线程 ID。

retval:用于存储线程的退出状态指针,如果不关心线程的退出状态,可以传入 NULL

示例代码:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>void *thread_function(void *arg) {// 线程执行一些任务后返回一个整数值作为退出状态int *result = (int *)malloc(sizeof(int));*result = 42;pthread_exit((void *)result);
}int main() {pthread_t thread_id;void *thread_result;// 创建线程if (pthread_create(&thread_id, NULL, thread_function, NULL)!= 0) {perror("线程创建失败");exit(EXIT_FAILURE);}// 回收线程并获取退出状态if (pthread_join(thread_id, &thread_result)!= 0) {perror("线程回收失败");exit(EXIT_FAILURE);}// 输出线程的退出状态printf("线程退出状态:%d\n", *(int *)thread_result);free(thread_result);printf("主线程继续执行\n");return 0;
}

五、线程取消 

pthread_cancel 函数用于请求取消一个线程的执行,但线程必须处于可取消状态并且能够响应取消请求(线程默认是可取消的,但有些情况下可能需要修改线程的可取消性状态)。

函数原型:int pthread_cancel(pthread_t thread);

示例代码:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>void *thread_function(void *arg) {// 线程执行一个循环,每隔一秒打印一次信息for (int i = 0; i < 10; ++i) {printf("线程运行中...\n");sleep(1);}pthread_exit(NULL);
}int main() {pthread_t thread_id;// 创建线程if (pthread_create(&thread_id, NULL, thread_function, NULL)!= 0) {perror("线程创建失败");exit(EXIT_FAILURE);}// 主线程睡眠 5 秒后尝试取消子线程sleep(5);if (pthread_cancel(thread_id)!= 0) {perror("线程取消失败");exit(EXIT_FAILURE);}// 回收线程(即使线程被取消,也应该进行回收以确保资源释放)pthread_join(thread_id, NULL);printf("主线程继续执行\n");return 0;
}

在上述代码中,主线程创建了一个子线程后,睡眠 5 秒,然后调用 pthread_cancel 尝试取消子线程的执行。子线程在执行过程中如果被成功取消,会立即终止,然后主线程通过 pthread_join 回收子线程资源。 

六、线程分离

线程分离是将线程设置为脱离状态,这样线程结束后其资源会自动被系统回收,而不需要其他线程调用 pthread_join 来回收。

函数原型:int pthread_detach(pthread_t thread);

示例代码:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>void *thread_function(void *arg) {// 线程执行一些任务后自动终止,由于被分离,不需要其他线程回收printf("线程执行任务后将自动释放资源\n");pthread_exit(NULL);
}int main() {pthread_t thread_id;// 创建线程if (pthread_create(&thread_id, NULL, thread_function, NULL)!= 0) {perror("线程创建失败");exit(EXIT_FAILURE);}// 分离线程if (pthread_detach(thread_id)!= 0) {perror("线程分离失败");exit(EXIT_FAILURE);}// 主线程继续执行其他任务,无需等待被分离的线程printf("主线程继续执行,无需等待子线程\n");return 0;
}

在这个例子中,创建线程后立即调用 pthread_detach 将线程设置为分离状态,线程执行完任务后会自动释放资源,主线程无需调用 pthread_join 等待其结束。

七、线程安全 

线程安全是指多个线程同时访问共享资源时,不会产生数据竞争和不一致的问题。实现线程安全通常需要使用同步机制,如互斥锁、自旋锁、读写锁、条件变量等。

以下是一个使用互斥锁实现线程安全的示例,多个线程对一个共享变量进行自增操作:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>// 共享变量
int shared_variable = 0;
// 互斥锁
pthread_mutex_t mutex;void *thread_function(void *arg) {for (int i = 0; i < 10000; ++i) {// 加锁,保护共享资源pthread_mutex_lock(&mutex);shared_variable++;// 解锁pthread_mutex_unlock(&mutex);}pthread_exit(NULL);
}int main() {pthread_t thread1, thread2;// 初始化互斥锁pthread_mutex_init(&mutex, NULL);// 创建两个线程if (pthread_create(&thread1, NULL, thread_function, NULL)!= 0) {perror("线程 1 创建失败");exit(EXIT_FAILURE);}if (pthread_create(&thread2, NULL, thread_function, NULL)!= 0) {perror("线程 2 创建失败");exit(EXIT_FAILURE);}// 等待线程结束pthread_join(thread1, NULL);pthread_join(thread2, NULL);// 销毁互斥锁pthread_mutex_destroy(&mutex);printf("共享变量最终值:%d\n", shared_variable);return 0;
}

在上述代码中,两个线程并发地对 shared_variable 进行自增操作。通过使用互斥锁 mutex,每次只有一个线程能够进入临界区(pthread_mutex_lock 和 pthread_mutex_unlock 之间的代码段)对共享变量进行操作,从而保证了数据的一致性和线程安全。如果没有互斥锁的保护,多个线程同时对共享变量进行读写操作可能会导致数据竞争和错误的结果。 

 

http://www.tj-hxxt.cn/news/717.html

相关文章:

  • 做网站哪个系统最好搜索引擎优化简历
  • 公益性网站建设广州seo优化电话
  • wordpress多站点模式插件什么是信息流广告
  • 网站添加google地图百度电脑版网页
  • 中国最好的影视后期培训学校长沙百度seo代理
  • 用织梦做的公司网站 经常被攻击网站服务器ip地址查询
  • 东莞专业网站营销服务器域名查询
  • 在网站上做宣传属于广告费用吗免费网站建设制作
  • 苏州知名网站建设设计seo顾问服务公司站长
  • 一个网站多个域名重定向怎么做市场营销策划方案模板
  • 如果评价网站做的好不好动态网站建设
  • 做的差的网站西安网站seo
  • 网站自适应手机转码2022年最火的新闻摘抄
  • 西安英文旅游网站建设谷歌seo外包公司哪家好
  • 网站开发软件dw百度浏览器官网在线使用
  • wordpress添加子主题重庆seo软件
  • 济南seo网站优化郑州seo排名哪有
  • treeson wordpress长沙靠谱seo优化
  • wordpress微信登录页面模板黑帽seo优化
  • 河北省镇政府做网站吗百度搜索关键词排名优化技术
  • 北京装饰公司名录电脑优化系统的软件哪个好
  • 企业手机微网站系统php百度联盟推广
  • 医疗卫生网站前置审批全国病毒感染最新消息
  • wordpress仿站pdf资源网站优化排名优化
  • 可以网站可以做免费的文案广告语安徽网站设计
  • 网站友情链接对方网站没有加入本站链接对本站有没有影响?济南seo排名优化推广
  • 常州网站排名优化搜索引擎推广文案
  • 网站建设狼雨抖音营销推广方案
  • 如何做 网站映射长春seo培训
  • 威海市建设局官方网站百度首页关键词推广