0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于Windows和Linux操作系统中线程同步了解

星星科技指导员 来源:嵌入式计算设计 作者:Eduard Trunov 2022-06-30 10:31 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

介绍

在现代操作系统中,每个进程都有自己的地址空间和一个控制线程。然而,在实践中,我们经常遇到需要在单个进程中执行多个并发任务并访问相同进程组件的情况:结构、打开的文件描述符等。

在任何情况下组织多线程模型都需要同时访问相同的资源。本文提供了有关 Windows 和 Linux 操作系统中线程的一般信息,然后介绍了防止访问共享资源的同步机制[1] 。

对于那些处理从一个系统移植到另一个系统的应用程序或在一个系统中创建多线程应用程序并想知道它在另一个系统中如何实际实现的人来说,这篇文章将会很有趣。本文对于那些从未编写过多线程应用程序但计划在未来这样做的人也很有用。

线程概念

这些线程是做什么用的?为什么我们不能只创建流程?后一种范式已经工作了很多年,但是流程创建有一些缺点,下面举几个例子:

进程创建操作是资源密集型的。

进程需要复杂的机制来访问相同的资源(命名或未命名的管道、消息队列、套接字等),而线程会自动获得对相同地址空间的访问权。

多线程进程的性能高于单线程。

多线程允许多个线程作为一个进程的一部分执行。具有线程的编程模型为开发人员提供了对同时执行的舒适抽象。具有线程的程序的优点之一是它在具有多核处理器的计算机上运行得更快。线程在创建时几乎不使用资源,或者额外的插件,例如资源访问机制;此外,线程的性能和应用程序交互性更高。除了地址空间,所有线程都使用:

工艺规定

信号处理程序(处理信号的设置)

当前目录

用户和组标识符

同时,每个线程都有自己的:

线程标识符

寄存器

信号屏蔽

优先

使用线程的主要函数

在通过 exec 调用启动程序时,会创建一个主线程(初始线程)。辅助线程是通过调用 Linux 的 pthread_create 或 Windows 的 _beginthread(ex) 创建的。

让我们更仔细地看看 Linux 的线程创建:

#include

int pthread_create(

pthread_t *tid,

const pthread_attr_t *attr,

void *(*func)(void *),

void *arg

);

/* Returns 0 in case of a successful completion, positive value in case of an error*/

每个线程都有它的标识符——pthread_t——和属性:优先级、初始堆栈大小、守护进程特性。创建线程时,需要指明将要执行的函数地址(func),以及单指针参数(arg)。Linux 中的线程应显式退出——通过调用pthread_exit函数——或隐式退出——通过从该函数返回[2]。如果在问题的条件下需要将多个参数传递给线程,则必须使用带参数的结构地址。

在 Windows 中,线程是在_beginthread(ex)或CreateThread函数的帮助下创建的。两者都是 ?-runtime 调用,它们之间的主要区别在于CreateThread是一个“原始”Win32 API,而_beginthread(ex)在其内部调用CreateThread 。在本文中,我们将讨论_beginthread(ex)函数。_beginthreadex的语法如下:

uintptr_t _beginthreadex(

void *security,

unsigned stack_size,

unsigned(__stdcall *start_address)(void *),

void *arglist,

unsigned initflag,

unsigned *thrdaddr

);

可以观察到pthread_create和_beginthreadex调用之间有一些模糊的相似性;但是,也存在差异。?hus,在 Windows 中:security– 指向SECURITY_ATTRIBUTES结构的指针,thrdaddr– 指向接收线程标识符的 32 位变量。

让我们考虑以下线程创建示例:

#include

#ifdef __PL_WINDOWS__

#include

#endif //__PL_WINDOWS__

#ifdef __PL_LINUX__

#include

#endif //__PL_LINUX__

#define STACK_SIZE_IN_BYTES (2097152) //2MB

#ifdef __PL_WINDOWS__

unsigned int __stdcall process_command_thread(void) {

#endif //__PL_WINDOWS__

#if defined (__PL_LINUX__) || (__PL_SOLARIS__) || (__PL_MACOSX__)

void *process_command_thread(void *p) {

#endif //(__PL_LINUX__) || (__PL_SOLARIS__) || (__PL_MACOSX__)

printf("Hello from process command thread\n");

return 0;

}

int main(int argc, char *argv[])

{

#ifdef __PL_WINDOWS__

DWORD process_command_thread_id;

HANDLE h_process_command_thread;

h_process_command_thread = (HANDLE)_beginthreadex(

NULL,

STACK_SIZE_IN_BYTES,

process_command_thread,

NULL,

0,

(unsigned long *)&process_command_thread_id

);

if (h_process_command_thread == NULL)

return -1;

#endif //__PL_WINDOWS__

#ifdef __PL_LINUX__

pthread_t h_process_command_thread;

int h_process_command_thread_initialized;

int ret;

ret = pthread_create(

&h_process_command_thread,

NULL,

process_command_thread,

NULL

);

if (ret != 0)

return -1;

h_process_command_thread_initialized = 1;

#endif // __PL_LINUX__

printf("Hello from main thread\n");

return 0;

}

输出将如下:

pYYBAGK9CzCAR_3CAAAiMbNQdgM391.png

很容易注意到 process_command_thread 没有以可视方式运行。当用于线程管理的内部结构被pthread_create或_beginthreadex函数初始化时,主线程完成执行。在 Linux 中调用 pthread_join 后,我们可以期待线程退出。

int pthread_join(pthread_t tid, void **retval);

线程可以是可连接的(默认情况下)或分离的。当一个可连接线程终止时,信息(标识符、终止状态、线程计数器等)会一直保存到调用pthread_join为止。

在 Windows 操作系统中,可以认为等待函数之一类似于pthread_join。等待函数系列允许线程中断其执行并等待资源被释放。让我们看一下pthread_join的类似物,即WaitForSingleObject:

DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMilliseconds);

调用此函数时,第一个参数hObject标识内核对象。该对象可能处于以下两种状态之一:“空闲”或“忙碌”。

第二个参数dwMilliseconds表示线程准备等待释放对象的毫秒数。

以下示例说明了pthread_join\WaitForSingleObject调用:

#ifdef __PL_WINDOWS__

DWORD status = WaitForSingleObject(

h_process_command_thread,

INFINITE

);

switch (status) {

case WAIT_OBJECT_0:

// The process terminated

break;

case WAIT_TIMEOUT:

// The process did not terminate within timeout

break;

case WAIT_FAILED:

// Bad call to function

break;

}

#endif //__PL_WINDOWS__

#ifdef __PL_LINUX__

int status = pthread_join(

h_process_command_thread,

NULL

);

switch (status) {

case 0:

// The process terminated

break;

case default:

// Bad call to function

break;

}

#endif //__PL_LINUX__

#ifdef __PL_WINDOWS__

//Windows code

#endif //__PL_WINDOWS__

#ifdef __PL_LINUX__

//Code for UNIX OS systems

#endif //__PL_LINUX__

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11628

    浏览量

    217947
  • WINDOWS
    +关注

    关注

    4

    文章

    3694

    浏览量

    93216
  • 操作系统
    +关注

    关注

    37

    文章

    7328

    浏览量

    128622
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux线程对比单线程的优势

    Linux系统中,线程操作系统能够进行运算调度的最小单位。线程被包含在进程之中,是进程中的实际运行单位。一个进程可以拥有多个
    发表于 12-01 06:11

    飞凌嵌入式ElfBoard-文件I/O的了解探究之竞争冒险

    的情况下,由于执行时序的不确定性,导致程序的执行结果无法确定。Linux是一个支持多任务和多用户同时运行的操作系统,它允许多个进程同时执行。在这种环境下,可能会有多个进程同时对同一个文件进行IO操作
    发表于 11-26 15:38

    单片机的操作系统

    Linux网络协议栈和文件系统(如JFFS2),但实时性较弱,需外扩存储器。 ‌ ‌ VxWorks ‌:高效实时操作系统,广泛应用于通信、军事等领域,支持自定义硬件模块。 ‌ 其他选择 ‌ Keil
    发表于 11-14 06:18

    Jtti Linux操作系统最常见的10大优势

    Linux操作系统的十大优势 Linux操作系统作为一种开源、自由的系统,已经广泛应用于个人计算机、服务器、嵌入式设备等多个领域。它的多样化
    的头像 发表于 11-06 15:32 127次阅读

    手持机PDA三大操作系统Android / 开源鸿蒙 / Windows对比

    本文全面解析手持机PDA主流操作系统(Android和开源鸿蒙和Windows)的技术特点、区别及适用场景,帮助企业根据自身业务需求选择合适的系统。包含多维度对比表格和实用选型建议。
    的头像 发表于 09-23 15:41 559次阅读
    手持机PDA三大<b class='flag-5'>操作系统</b>Android / 开源鸿蒙 / <b class='flag-5'>Windows</b>对比

    聚徽厂家解码——工控机操作系统选择:WindowsLinux、QNX 如何匹配工业场景

    在工业自动化进程不断推进的当下,工控机作为核心设备,其操作系统的恰当选择对工业生产的稳定性、高效性和安全性起着决定性作用。常见的 WindowsLinux 和 QNX 操作系统,各自
    的头像 发表于 05-29 16:28 1234次阅读

    如何设置 Raspberry Pi 操作系统 Windows 模拟器:完全指南!

    为何要在Windows上模拟树莓派操作系统?在Windows上模拟树莓派操作系统是利用虚拟化技术进行开发、测试和学习,而无需物理树莓派硬件,这是一种强大的方式,并且允许您在Window
    的头像 发表于 05-20 16:23 758次阅读
    如何设置 Raspberry Pi <b class='flag-5'>操作系统</b> <b class='flag-5'>Windows</b> 模拟器:完全指南!

    Linux主要的性能有哪些?

      什么是Linux?   Linux是一套自由传播的类Unix操作系统,是一个基于posix和unix的多用户、多任务、支持多线程和多cpu的操作
    的头像 发表于 04-30 18:09 484次阅读
    <b class='flag-5'>Linux</b>主要的性能有哪些?

    鸿道Intewell操作系统Linux实时拓展方案

    鸿道Intewell操作系统是科东软件自主研发的新型工业实时操作系统,历经30多年研发积累,采用业界领先的微内核架构,具备高实时、高安全及强扩展的特性,是目前国内唯一通过汽车、工业控制、医疗仪器、轨道交通四项功能安全认证的操作系统
    的头像 发表于 02-27 10:08 616次阅读
    鸿道Intewell<b class='flag-5'>操作系统</b>的<b class='flag-5'>Linux</b>实时拓展方案

    鸿道Intewell操作系统:赋能高端装备制造,引领国产数控系统迈向新高度

    鸿道Intewell操作系统采用领先的微内核架构,结合自主研发的Hypervisor虚拟化技术,实现了高实时性、高安全性与强扩展性的完美统一。其独特的Windows/Linux实时扩展架构,支持
    的头像 发表于 02-19 15:03 747次阅读

    鸿道Intewell操作系统为半导体行业打造高可靠实时控制系统

    方案使用鸿道Intewell操作系统实时扩展架构,该架构利用多核处理器,实现Windows/Linux应用和实时应用的并行运行,且Windows/L
    的头像 发表于 02-08 16:13 785次阅读
    鸿道Intewell<b class='flag-5'>操作系统</b>为半导体行业打造高可靠实时控制<b class='flag-5'>系统</b>

    国产银河麒麟操作系统V10和星光麒麟V1.0操作系统如何选择?

    国产银河麒麟操作系统和星光麒麟操作系统都是由中国电子旗下科技企业麒麟软件有限公司(简称“麒麟软件”)开发的国产自主可控的操作系统。麒麟软件介绍:麒麟软件以安全可信操作系统技术为核心,面
    的头像 发表于 01-24 09:14 4211次阅读
    国产银河麒麟<b class='flag-5'>操作系统</b>V10和星光麒麟V1.0<b class='flag-5'>操作系统</b>如何选择?

    云服务器选择什么操作系统好?

    云服务器选择什么操作系统好?选择云服务器操作系统需考虑业务需求、兼容性、安全性、易用性及成本。Linux系统如CentOS、Ubuntu和Debian因稳定、免费且社区支持强大而受欢迎
    的头像 发表于 01-21 10:56 734次阅读

    鸿道Intewell操作系统Windows实时拓展方案

    鸿道Intewell操作系统Windows实时拓展方案,即鸿道Intewell-Win构型,是一款专为工业控制领域设计的国产操作系统,支持Windows实时扩展,具备以下特点和优势:
    的头像 发表于 12-24 17:40 833次阅读
    鸿道Intewell<b class='flag-5'>操作系统</b>的<b class='flag-5'>Windows</b>实时拓展方案

    deepin操作系统介绍

    希望从自己的能力和对桌面操作系统的理解,能给 Linux 的用户与开发者更多的选择。我们也相信 deepin 能够得到更多用户的认可与喜爱,成为开源世界的最佳选择。  一、 deepin 操作系统 先说
    的头像 发表于 12-23 09:08 3221次阅读
    deepin<b class='flag-5'>操作系统</b>介绍