Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 是CreateThread()吗;同步点;?_Winapi_Thread Synchronization - Fatal编程技术网

Winapi 是CreateThread()吗;同步点;?

Winapi 是CreateThread()吗;同步点;?,winapi,thread-synchronization,Winapi,Thread Synchronization,我正在编写一些Win32代码,如下所示: myctx.somedata = 42; CreateThread(blablabla, &my_thread_entry_func, &myctx); 我能指望新创建的线程一出现就看到myctx.somedata=42的效果吗?重要的是,我怎么能自己查到这个 在Linux下,pthreads的行为如何?在内部,线程将与一些结构相关联,操作系统在其中存储线程数据。这适用于任何操作系统 CreateThread(或任何模拟函数)正在做什么

我正在编写一些Win32代码,如下所示:

myctx.somedata = 42;
CreateThread(blablabla, &my_thread_entry_func, &myctx);
我能指望新创建的线程一出现就看到
myctx.somedata=42
的效果吗?重要的是,我怎么能自己查到这个


在Linux下,
pthreads
的行为如何?

在内部,线程将与一些结构相关联,操作系统在其中存储线程数据。这适用于任何操作系统

CreateThread(或任何模拟函数)正在做什么?它首先创建并初始化此结构,然后将其推送到某个内部调度程序数据库中

然后调度程序(在任意核心上)从该数据库弹出线程结构,并开始执行它的代码

比调度程序从数据库弹出线程数据后更明显-它必须在推送之前查看写入线程数据的所有数据。这意味着push必须具有最小发布语义和pop获取语义的方式


因为
myctx.somedata=42发生在创建线程数据之前,当然它也将在调度程序弹出线程数据的位置可见。调度程序弹出线程数据后,将执行用户线程代码。所以它当然是view
myctx.somedata=42也是。

的确,如果没有完整的内存屏障来保护其内部数据结构,操作系统就无法添加线程。那些隐含的障碍非常难看,但每个人都依赖它,所以他们再也不能改变它了。@HansPassant,你知道操作系统不能改变它的具体技术原因吗?每个上下文切换都是一个同步点吗?是的,新线程当然会在
CreateThread
调用之前看到所有内存写入。在内部,这样的cal会对一些变量进行许多互锁写入,并且在开始之前,新线程将从这些变量中读取。这与您自己编写的代码没有什么不同。在它成为软件细节之前,它是一个处理器细节,线程对您和操作系统都需要锁或屏障。