Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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
C++ 在多线程C++;代码_C++_C_Multithreading_Legacy - Fatal编程技术网

C++ 在多线程C++;代码

C++ 在多线程C++;代码,c++,c,multithreading,legacy,C++,C,Multithreading,Legacy,假设我们有一个遗留的C文件,其中包含一些函数来求解线性方程组和几个相应的全局变量 lineq.c: /* macro definitions */ ... /* global vars */ ... /* some functions that make use of above variables */ void solveLinEq(...); 现在我们想在一个现代多线程C++应用程序中使用这个遗留库。因此,我们想编写一种包装类LinEqSolver,它提供了一个用于求解线性方程组的OO接

假设我们有一个遗留的C文件,其中包含一些函数来求解线性方程组和几个相应的全局变量

lineq.c:

/* macro definitions */
...
/* global vars */
...
/* some functions that make use of above variables */
void solveLinEq(...);

现在我们想在一个现代多线程C++应用程序中使用这个遗留库。因此,我们想编写一种包装类

LinEqSolver
,它提供了一个用于求解线性方程组的OO接口,并在内部调用我们遗留C库的函数

但是,不同线程可能使用多个
LinEqSolver
实例。这要求每个实例/每个线程在
lineq.c
中都有自己的全局变量副本。如果我们不想修改
lineq.c
,如何实现这一点

我可以想象的一个可能的解决方案是将全局变量和函数从C文件复制到类
LinEqSolver
,使它们成为数据和函数成员。然后,
LinEqSolver
的每个实例都将对其前globale变量的私有副本进行操作。但是,这种复制粘贴编程风格相当糟糕,尤其是当
lineq.c
有更新时,我们需要再次将更改复制粘贴到代码中


如果解线性方程的实际代码停留在
lineq.c
中,并且只是从
LinEqSolver
调用,我还有什么其他可能性呢?

您可以将
lineq.c
放在共享对象中,并使用
dlopen
RTLD\u PRIVATE
多次加载它,并对每个对象使用
dlsym
线程,因此全局变量对于每个线程都是独立的。不幸的是,glibc不支持
RTLD\u PRIVATE
。解决方法是为每个具有不同名称的线程复制共享对象,并使用
dlopen
复制具有
RTLD\u LOCAL
的共享对象
lineq.c
保持不变。

我会咬紧牙关,修改它,将全局变量添加到结构中,该结构应作为指向lineq.c中所有调用的指针传递

<> P>使用C++类包装,每个线程有一个实例等


另一种选择是修改c文件以使用_declspec(thread)或类似文件。但是,如果您计划将此代码放入dll中,则可能会出现无法克服的问题(至少在Windows上)。

您可以使用C++11中的
thread\u local
关键字。如果函数总是在开始时初始化所有需要的静态变量,这将很好地工作

如果你有更复杂的图片-更多的工作将需要。例如:

int myVar1, myVar2;

void InitStaticVars()
{
   ....
}

void solveLinEq(...);

如果您只需将
thread\u local
说明符添加到上述变量中,并在程序开始时调用初始化函数,它将仅为调用线程初始化这些变量。在所有其他线程中,它们的初始值都是零。

只是友好的注释:C在某些领域中不是比C++更具继承性。在应用领域,它和C++一样具有现代性。令人惊讶的是,您还可以轻松地编写C多线程程序。更有趣的是:core langauge的大多数线程功能都非常相似。对不起,如果您有全局变量,并且不想接触原始代码,那么您基本上无能为力。@Olaf:听起来lineq库是遗留代码,因为它是如何/何时编写的,而不是因为它使用C。这是一个现实的机会吗,你会得到lineq的更新吗?程序结构听起来像是有一段时间没碰过的东西。@MikeMB:我主要指的是反模式“legacy”和“modern”,而不是“legacy library”。无论是有意还是无意,imho OP都会给人留下错误的印象。关于这个问题我可能有点肤浅,但我有我的理由。我刚刚读了一些关于thread_local的东西,听起来很有希望。但是,据我所知,如果我只添加thread_局部说明符,而不受进一步的限制,它应该可以工作。你能进一步解释一下你的限制吗?