草庐IT

线程通信

全部标签

c - 如何从 ml64.exe(MSVC 64 位 X64 汇编程序)访问线程本地存储?

以下C函数尝试使用线程局部存储变量以线程安全的方式防止多核代码中的递归。但是,由于有些复杂的原因,我需要在X64汇编程序(IntelX86/AMD64位)中编写此函数,并使用VC2010中的ml64.exe进行汇编。如果我使用全局变量,我知道如何执行此操作,但我不确定如何使用具有__declspec(thread)的TLS变量正确执行此操作。__declspec(thread)inttls_VAR=0;voidnorecurse(){if(0==tls_VAR){tls_VAR=1;DoWork();tls_VAR=0;}}注意:这是VC2010踢出来的功能。但是,MASM(ml64.

c - 在 C 中,多线程,多个窗口调用一个窗口过程,每次调用都会使用新的局部变量还是我需要互斥体?

我试图在标题中解释这一切:我有一个多线程C程序,它将有多个窗口调用一个窗口过程。在窗口过程中完成了一些处理。我是否需要保护它,或者每次调用窗口过程都会在内存中分开?我的直觉是我不需要互斥锁,因为它们都是局部变量,这是错误的吗?LRESULTAPIENTRYEditSubclassProc(HWNDhwnd,UINTuMsg,WPARAMwParam,LPARAMlParam){if(uMsg==WM_GETDLGCODE)returnDLGC_WANTALLKEYS;elseif(uMsg==WM_CHAR){if((int)wParam==13){char*strCurrentCom

windows - 如何使用线程 ID 检索线程的起始地址?

我想使用它的ID获取线程的起始地址。可能吗? 最佳答案 所有你需要的是OpenThread并调用NtQueryInformationThread第二个参数设置为ThreadQuerySetWin32StartAddress另请参阅此article 关于windows-如何使用线程ID检索线程的起始地址?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/10887866/

c# - 在C#中使用参数委托(delegate)给其他线程

如何在C#中将带参数的函数委托(delegate)给另一个线程?如果我自己尝试,我会得到这个错误:errorCS0149:Methodnameexpected这是我现在拥有的:delegatevoidBarUpdateDelegate();privatevoidUpdateBar(intValue,intMaximum,ProgressBarBar){if(Bar.InvokeRequired){BarUpdateDelegateDelegation=newBarUpdateDelegate(Value,Maximum,Bar);//errorCS0149:Methodnameexpe

windows - 内核模式驱动程序和用户模式应用程序之间的双向通信?

我需要在内核模式WFP驱动程序和用户模式应用程序之间进行双向通信。驱动程序通过将URL传递给应用程序来启动通信,然后应用程序对该URL进行分类(娱乐、新闻、成人等)并将该类别传递回驱动程序。驱动程序需要知道过滤器功能中的类别,因为它可能会根据该信息阻止某些网页。我在应用程序中有一个线程正在发出I/O请求,驱动程序将使用URL和GUID完成,然后应用程序会将类别写入该GUID下的注册表中,驱动程序将在其中获取它。不幸的是,正如驱动程序验证者指出的那样,这是不稳定的,因为Zw注册表函数必须在PASSIVE_LEVEL运行。我正在考虑用映射内存缓冲区尝试同样的事情,但我不确定中断要求是什么。

c++ - Windows 线程 sleep 并从另一个线程唤醒

我有一个线程在一个类中运行,我想让自己进入休眠状态,并在另一个线程唤醒它时唤醒,如果可能的话,不传递互斥锁或其他元素,所以它是自包含的。基本上,我已经尝试过在调用WaitForSingleObject两次的线程中使用互斥锁的方法,期望它使互斥锁在第一次调用时不发出信号,但每次函数返回0,因为互斥锁已经发出信号并且线程是互斥锁的所有者,并且仍然是所有者。例如,我希望一旦进入休眠状态,就会调用一个类方法来释放互斥量。在Windows中是否有一个简单的方法来解决这个问题,或者我会被迫打破封装吗?运行 最佳答案 虽然Waitable句柄方法

c++ - 如何获取我的线程的语言环境名称?

例如,我可以使用_create_locale在我的C程序中设置语言环境因此:localeUS=_create_locale(LC_ALL,"English_UnitedStates.1252");但我需要的是相反的,即为调用线程检索语言环境名称(上面函数的第二个参数)。知道怎么做吗?附言。我知道现代Windows使用LCID。我需要此语言环境名称以与旧代码兼容。 最佳答案 希望您可以使用标准C++。来自std::locale::name:例子#include#include#includeintmain(){std::localel

c++ - 如何获取当前进程的线程 ID 列表

EnumProcess或CreateToolhelp32Snapshot函数帮助我们获取进程信息,包括进程ID。但是我想知道获取当前进程的线程id列表。DWORDGetMainThreadId(DWORDpId){LPVOIDlpThId;_asm{moveax,fs:[18h]addeax,36mov[lpThId],eax}HANDLEhProcess=OpenProcess(PROCESS_VM_READ,FALSE,pId);if(hProcess==NULL)returnNULL;DWORDtId;if(ReadProcessMemory(hProcess,lpThId,&t

windows - 如何在 Windows 中获得线程句柄的访问权限 THREAD_QUERY_INFORMATION

我想使用GetExitCodeThread()。MSDN文档说,“句柄必须具有THREAD_QUERY_INFORMATION或THREAD_QUERY_LIMITED_INFORMATION访问权限。”我使用_beginthreadex()创建我的线程。当我调用这个API时,我应该如何设置THREAD_QUERY_INFORMATION标志?它应该是initFlag的一部分吗?文档没有说明必须如何准确设置此标志。 最佳答案 _beginthreadex返回的句柄已经足够访问线程以查询有限的信息。毕竟它有终止线程的权限,这远不止查询

c++ - 虚拟机ubuntu中两个c++可执行文件一个窗口和另一个窗口之间的实时数据通信

我正在运行ros以使用ubuntu控制机器人。但驱动程序仅适用于Windows。我已经设置了一个虚拟机,其中机器人Controller构建在roscpp上我想将这些使用ros生成的值传递给Windows中的cpp。它应该是实时的。数据应该来回流动。data:float32数组维度为7请帮我举个例子。 最佳答案 在两台机器之间传递实时数据的最佳方式之一是UDP套接字。您可以在MSDNUDPExample找到一些很好的Windows示例一个用于linux,地址为LinuxUDPExample