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
    +关注

    关注

    87

    文章

    11285

    浏览量

    209267
  • WINDOWS
    +关注

    关注

    3

    文章

    3540

    浏览量

    88596
  • 操作系统
    +关注

    关注

    37

    文章

    6794

    浏览量

    123275
收藏 人收藏

    评论

    相关推荐

    如何在windows上emulate不同操作系统

    一、虚拟化技术概述 虚拟化技术允许在单个物理机器上创建多个虚拟机,每个虚拟机都可以运行不同的操作系统。这使得我们可以在Windows系统上模拟其他操作系统,而无需购买额外的硬件。虚拟化
    的头像 发表于 12-05 15:50 142次阅读

    国产实时操作系统:和RT-Linux,Zephyr的实时性对比

    基于RT-Thread内核,并具备POSIX用户态运行环境的高性能实时操作系统。它类似LinuxWindows的架构,具备用户态和内核态(并相分离),用户态具备全地址空
    的头像 发表于 11-12 01:07 627次阅读
    国产实时<b class='flag-5'>操作系统</b>:和RT-<b class='flag-5'>Linux</b>,Zephyr的实时性对比

    linux是实时系统还是分时操作系统

    大家平时玩单片机基本上对于µC/OS、FreeRTOS、ThreadX这些操作系统非常熟悉了,他们都属于实时操作系统(RTOS),在工业领域比较广泛;然而对于linux这样的基于时间片划分的非实时
    的头像 发表于 11-11 11:43 400次阅读

    linux操作系统安装步骤 linux操作系统的特点及组成

    Linux操作系统安装步骤 Linux操作系统是一种开源的操作系统,它以其稳定性、安全性和灵活性而闻名。以下是安装
    的头像 发表于 10-21 11:24 512次阅读

    Windows操作系统是什么?它有哪些特点?

    Windows操作系统是由美国微软公司(Microsoft Corporation)开发和推出的一种计算机操作系统。自1985年Windows 1.0版本发布以来,
    的头像 发表于 08-07 16:30 2350次阅读

    Windows操作系统中的常用命令

    Windows操作系统提供了许多实用的命令行工具,通过命令行界面(Command Prompt)或Windows PowerShell,用户可以执行各种任务,如文件管理、系统维护、网络
    的头像 发表于 08-07 15:40 594次阅读
    <b class='flag-5'>Windows</b><b class='flag-5'>操作系统</b>中的常用命令

    CYAT81658是否支持Windows操作系统

    我们的一位客户要求将触摸集成电路用于他们自己的产品。 他们使用的是 Windows 10 操作系统。 我想知道我们的产品触摸 IC(CYAT81658)是否支持 Windows 操作系统
    发表于 07-05 07:36

    工业实时操作系统对比:鸿道Intewell跟rt-linux有啥区别

    Intewell和RT-Linux是两种不同的实时操作系统(RTOS),它们具有各自独特的特点和优势。以下是Intewell操作系统的一些关键特性,以及与RT-Linux的比较:
    的头像 发表于 07-03 10:00 506次阅读
    工业实时<b class='flag-5'>操作系统</b>对比:鸿道Intewell跟rt-<b class='flag-5'>linux</b>有啥区别

    研华工控机用什么系统WindowsLinux操作系统的较量

    工控机用什么系统WindowsLinux操作系统的较量。工控机(工业控制计算机)作为工业自动化和监控系统的核心组件,其稳定性、可靠性和性
    的头像 发表于 06-14 14:38 684次阅读
    研华工控机用什么<b class='flag-5'>系统</b>?<b class='flag-5'>Windows</b>与<b class='flag-5'>Linux</b><b class='flag-5'>操作系统</b>的较量

    服务器操作系统有几种?

    Linux、Unix等等,而人们常常应用的大部 分全是WindowsLinux系统软件。今日,小编就简单的给大伙儿介绍一下这两种常见的网络服务器电脑
    发表于 03-29 16:59

    CYUSB3314-88LTXI CAN支持哪些操作系统系统

    CYUSB3314-88LTXI CAN支持哪些操作系统系统? 它是否也包括Raspberry Pi(HW / OS)/Apple/Linux,谢谢! 树莓派 (HW)树莓派 (OS)Win
    发表于 02-26 06:57

    linux服务器和windows服务器

    Linux服务器和Windows服务器是目前应用最广泛的两种服务器操作系统。两者各有优劣,也适用于不同的应用场景。本文将 对Linux服务器和Win
    发表于 02-22 15:46

    Linux操作系统上的射频测试模式应用指南

    电子发烧友网站提供《Linux操作系统上的射频测试模式应用指南.pdf》资料免费下载
    发表于 02-19 09:39 0次下载
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系统</b>上的射频测试模式应用指南

    linuxwindows的区别 linux系统一般用来干嘛

    LinuxWindows是两种不同的操作系统,有着不同的设计理念和用途。本文将对LinuxWindows的区别进行详细分析,并介绍
    的头像 发表于 02-05 14:06 938次阅读

    Linux操作系统中如何按下PCIe的复位键

    Linux操作系统中,看如何按下PCIe的复位键
    的头像 发表于 01-20 09:31 1554次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系统</b>中如何按下PCIe的复位键