以下是IBM所说的可重入代码片段:
/* reentrant function (a better solution) */
char *strtoupper_r(char *in_str, char *out_str)
{
int index;
for (index = 0; in_str[index]; index++)
out_str[index] = toupper(in_str[index]);
out_str[index] = 0
return out_str;
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这段代码不可重入,因为循环计数器的索引是在本地定义的.如果操作系统在循环中中断此线程,并且另一个线程调用此函数,则索引将丢失.我错过了什么?为什么这段代码被认为是可重入的?
操作系统在中断线程时是否将局部变量(如索引)的副本保存到线程的堆栈中,然后在处理继续时重新建立变量?
它似乎使这个函数可重入索引必须是接口的一部分作为调用者提供的存储.
由于某种原因,传递hWnd或新创建的MDI窗口的指针不能在工作线程中重新编写为其原始值.我试过从App类,Document类和View类创建线程.都具有相同的效果.我正在为工作线程使用全局函数.有趣的是,我在1998年使用与MFC MDI中相同的代码相同的代码,当时效果很好,但现在似乎不起作用.
也许我只是没有看到问题.这里发生了什么?我想要做的是简单,创建一个新的View窗口,捕获它的hWnd并将该hWnd传递给工作线程,以便工作线程可以向窗口发送消息以打印字符串等等.我想从Document类启动线程.编译器是VS2010,它在Debug中运行.
看完之后:http: //msdn.microsoft.com/en-us/library/h14y172e%28v=VS.100%29.aspx,我意识到你可能无法将指针传递给工人的视图类线程.所以我专注于hWnds.在OnTestConnect块中,返回有效的hWnd以及指向新View窗口的有效指针.
这是代码(来自App类):
struct THREADPARMS
{
HWND hWndView;
int test;
};
Run Code Online (Sandbox Code Playgroud)
(注意,我已经尝试将结构定义为typedef并使用变量名称,所有结果都相同)
UINT Starter( LPVOID pParms )
{
THREADPARMS* pThreadParms = (THREADPARMS* )pParms;
//This step shouldn't be necesarry but I tried it anyway. Should
//be able to use pThreadParms->hWndView without casting.
//The hWnd value does not come across as valid. It is valid before sending.
HWND hWnd = (HWND)pThreadParms->hWndView;
//The int comes across fine
int iNum = pThreadParms->test;
CHFTAppBView* pView = (CHFTAppBView*) CHFTAppBView::FromHandle(hWnd);
//This …Run Code Online (Sandbox Code Playgroud) 当我遇到 lnk2005 错误时,我正在玩命名空间。我不知道如何解决这个错误。这是错误:
1>Source.obj : error LNK2005: "int Chart::Bars::d" (?d@Bars@Chart@@3HA) already defined in Chart.obj
1>Source.obj : error LNK2005: "class foo Chart::l" (?l@Chart@@3Vfoo@@A) already defined in Chart.obj
1>Source.obj : error LNK2005: "int Chart::t" (?t@Chart@@3HA) already defined in Chart.obj
1>C:\Users\bnm\dev\examples\play\nmspca\Debug\nmspca.exe : fatal error LNK1169: one or more multiply defined symbols found
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.49
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Run Code Online (Sandbox Code Playgroud)
这是代码...
图表.h
#pragma once
#include "foo.h"
namespace Chart
{
int t;
foo l; …Run Code Online (Sandbox Code Playgroud)