user-0 提问: 为了解决多线程的问题将SO复制多份进行处理，可行吗？

回复:
user: user-1
content: 引用 14 楼 lgmsyy 的回复:[quote=引用 13 楼 Saleayas 的回复:] 使用复制的方法，如果那个 DLL 没有问题。 可以把 DLL 放到资源里，然后，当你需要创建一个线程的时候， 把这个 DLL 的资源释放到临时文件夹中，并且使用临时文件名。 然后，加载并导出函数。 这样，在不同的线程中，这些 DLL 函数就是不同的。  但是，如果这些 DLL 还依赖其他的 DLL，或者有特殊的地方，多线程就会出问题。 因为 开发这个 DLL 的人根本可能就只测试了一个进程一个线程的问题。  我是这样认为：首先我复制了两份SO/DLL文件。然后我开启了两个线程，其中每个线程类对应不同的SO/DLL。是这样吗？  我这样测试了，确实可以。但是我同时又发现，当我通过WEB应用连续执行的时候，会造成系统的不稳定。我不知道这是另外的错误引起的，还是因为我当前这么做而引起的？[/quote]  只有调试分析才能知道。

user: user-2
content: 引用 14 楼 lgmsyy 的回复:[quote=引用 13 楼 Saleayas 的回复:] 使用复制的方法，如果那个 DLL 没有问题。 可以把 DLL 放到资源里，然后，当你需要创建一个线程的时候， 把这个 DLL 的资源释放到临时文件夹中，并且使用临时文件名。 然后，加载并导出函数。 这样，在不同的线程中，这些 DLL 函数就是不同的。  但是，如果这些 DLL 还依赖其他的 DLL，或者有特殊的地方，多线程就会出问题。 因为 开发这个 DLL 的人根本可能就只测试了一个进程一个线程的问题。  我是这样认为：首先我复制了两份SO/DLL文件。然后我开启了两个线程，其中每个线程类对应不同的SO/DLL。是这样吗？  我这样测试了，确实可以。但是我同时又发现，当我通过WEB应用连续执行的时候，会造成系统的不稳定。我不知道这是另外的错误引起的，还是因为我当前这么做而引起的？[/quote]  你确认这两个 DLL 是交替使用的，而且在再次使用前，确认被释放了。 那个 DLL 的 PROCESS_ATTACH 和 THREAD_ATTACH 以及对应的 DETACH 可能没有处理好。 所以，在你不确认那个 DLL 的时候，每次都是用一个新的 DLL 名字。

user: user-3
content: 引用 18 楼 zhao4zhong1 的回复:[quote=引用 17 楼 lgmsyy 的回复:] [quote=引用 16 楼 zhao4zhong1 的回复:] 每个复制的so要改名为互不相同的文件名。  SO的名字我是可以更改为互不相同的。但是SO中的函数名称我更改不了啊[/quote] 函数名称不用改。 在每个进程中用LoadLibrary加载各自对应的dll文件，GetProcAddress，……，FreeLibrary[/quote] 这是windows  Linux下参考下面： EXAMPLE Load the math library, and print the cosine of 2.0:  #include <stdio.h> #include <dlfcn.h>  int main(int argc, char **argv) {     void *handle;     double (*cosine)(double);     char *error;      handle = dlopen ("libm.so", RTLD_LAZY);     if (!handle) {         fprintf (stderr, "%s\n", dlerror());         exit(1);     }      dlerror();    /* Clear any existing error */     *(void **) (&cosine) = dlsym(handle, "cos");     if ((error = dlerror()) != NULL)  {         fprintf (stderr, "%s\n", error);         exit(1);     }      printf ("%f\n", (*cosine)(2.0));     dlclose(handle);     return 0; }  If this program were in a file named "foo.c", you would build the program with the following command:   gcc -rdynamic -o foo foo.c -ldl   Libraries exporting _init() and _fini() will want to be compiled as follows, using bar.c as the example name:   gcc -shared -nostartfiles -o bar bar.c

user: user-3
content: 引用 17 楼 lgmsyy 的回复:[quote=引用 16 楼 zhao4zhong1 的回复:] 每个复制的so要改名为互不相同的文件名。  SO的名字我是可以更改为互不相同的。但是SO中的函数名称我更改不了啊[/quote] 函数名称不用改。 在每个进程中用LoadLibrary加载各自对应的dll文件，GetProcAddress，……，FreeLibrary

user: user-0
content: 引用 16 楼 zhao4zhong1 的回复:每个复制的so要改名为互不相同的文件名。  SO的名字我是可以更改为互不相同的。但是SO中的函数名称我更改不了啊

user: user-3
content: 每个复制的so要改名为互不相同的文件名。

user: user-0
content: 引用 14 楼 lgmsyy 的回复:[quote=引用 13 楼 Saleayas 的回复:] 使用复制的方法，如果那个 DLL 没有问题。 可以把 DLL 放到资源里，然后，当你需要创建一个线程的时候， 把这个 DLL 的资源释放到临时文件夹中，并且使用临时文件名。 然后，加载并导出函数。 这样，在不同的线程中，这些 DLL 函数就是不同的。  但是，如果这些 DLL 还依赖其他的 DLL，或者有特殊的地方，多线程就会出问题。 因为 开发这个 DLL 的人根本可能就只测试了一个进程一个线程的问题。  我是这样认为：首先我复制了两份SO/DLL文件。然后我开启了两个线程，其中每个线程类对应不同的SO/DLL。是这样吗？  我这样测试了，确实可以。但是我同时又发现，当我通过WEB应用连续执行的时候，会造成系统的不稳定。我不知道这是另外的错误引起的，还是因为我当前这么做而引起的？[/quote]  注意，因为线程数和复制的SO/DLL文件数量一致。所以每个线程类对应不同的SO/DLL。

user: user-0
content: 引用 13 楼 Saleayas 的回复:使用复制的方法，如果那个 DLL 没有问题。 可以把 DLL 放到资源里，然后，当你需要创建一个线程的时候， 把这个 DLL 的资源释放到临时文件夹中，并且使用临时文件名。 然后，加载并导出函数。 这样，在不同的线程中，这些 DLL 函数就是不同的。  但是，如果这些 DLL 还依赖其他的 DLL，或者有特殊的地方，多线程就会出问题。 因为 开发这个 DLL 的人根本可能就只测试了一个进程一个线程的问题。  我是这样认为：首先我复制了两份SO/DLL文件。然后我开启了两个线程，其中每个线程类对应不同的SO/DLL。是这样吗？  我这样测试了，确实可以。但是我同时又发现，当我通过WEB应用连续执行的时候，会造成系统的不稳定。我不知道这是另外的错误引起的，还是因为我当前这么做而引起的？

user: user-2
content: 使用复制的方法，如果那个 DLL 没有问题。 可以把 DLL 放到资源里，然后，当你需要创建一个线程的时候， 把这个 DLL 的资源释放到临时文件夹中，并且使用临时文件名。 然后，加载并导出函数。 这样，在不同的线程中，这些 DLL 函数就是不同的。  但是，如果这些 DLL 还依赖其他的 DLL，或者有特殊的地方，多线程就会出问题。 因为 开发这个 DLL 的人根本可能就只测试了一个进程一个线程的问题。

user: user-4
content: 引用 11 楼 lgmsyy 的回复:[quote=引用 8 楼 60 的回复:] 一个SO，只能被一个进程加载一次。  >> 对方说“为了解决多线程的问题将SO复制多份进行处理”，然后分别调用以实现多线程。 问题是怎么解决 方法重名的问题。  可以考虑用5楼的方式使用多进程调用这个so，然后你写一个调度管理进程，统一进行管理。  是不是这个意思：我写一个线程，其实是每个线程调用不同的对应进程而已。是这样吗？ 然后可以统一管理这个线程[/quote]楼主先确定下进程跟线程是什么东东

user: user-0
content: 引用 8 楼 60 的回复:一个SO，只能被一个进程加载一次。  >> 对方说“为了解决多线程的问题将SO复制多份进行处理”，然后分别调用以实现多线程。 问题是怎么解决 方法重名的问题。  可以考虑用5楼的方式使用多进程调用这个so，然后你写一个调度管理进程，统一进行管理。  是不是这个意思：我写一个线程，其实是每个线程调用不同的对应进程而已。是这样吗？ 然后可以统一管理这个线程

user: user-0
content: 引用 8 楼 60 的回复:一个SO，只能被一个进程加载一次。  >> 对方说“为了解决多线程的问题将SO复制多份进行处理”，然后分别调用以实现多线程。 问题是怎么解决 方法重名的问题。  可以考虑用5楼的方式使用多进程调用这个so，然后你写一个调度管理进程，统一进行管理。  这个好办，我可以在外封装一层SO，通过我封装的SO重新命名。

user: user-0
content: 引用 7 楼 user-6 的回复:明显是为了糊弄你 也不能这么说，如果对方确实不支持多线程，那么就想办法其他方式呗。

user: user-0
content: 有人帮忙吗？

user: user-5
content: 一个SO，只能被一个进程加载一次。  >> 对方说“为了解决多线程的问题将SO复制多份进行处理”，然后分别调用以实现多线程。 问题是怎么解决 方法重名的问题。  可以考虑用5楼的方式使用多进程调用这个so，然后你写一个调度管理进程，统一进行管理。

user: user-6
content: 明显是为了糊弄你

user: user-3
content: 引用 4 楼 tiantangxingkong 的回复:[quote=引用 3 楼 lgmsyy 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] 使用多进程。  我的描述，是不是就是多进程方式。[/quote]把你的程序用鼠标双击多次[/quote]  如果不行，你还可以多WindowsStation CreateWindowStation The CreateWindowStation function creates a window station object. It returns a handle that can be used to access the window station. A window station is a secure object that contains a set of global atoms, a clipboard, and a set of desktop objects.  HWINSTA CreateWindowStation(   LPTSTR lpwinsta,        // name of the new window station   DWORD dwReserved,       // reserved; must be NULL   DWORD dwDesiredAccess,  // specifies access of returned handle   LPSECURITY_ATTRIBUTES lpsa  // specifies security attributes of                                // the window station );   Parameters lpwinsta  Optionally points to a null-terminated string specifying the name of the window station to be created. Window station names are case-insensitive and cannot contain backslash characters (\). Only members of the Administrators group are allowed to specify a name. If lpwinsta is NULL, the system forms a window station name using the logon session identifier for the calling process. To get this name, call the GetUserObjectInformation function.  dwReserved  Reserved; must be NULL.  dwDesiredAccess  Specifies the type of access to the window station. This parameter can be one or more of the following values: Value Description  WINSTA_ACCESSCLIPBOARD Required to use the clipboard.  WINSTA_ACCESSGLOBALATOMS Required to manipulate global atoms.  WINSTA_CREATEDESKTOP Required to create new desktop objects on the window station.  WINSTA_ENUMDESKTOPS Required to enumerate existing desktop objects.  WINSTA_ENUMERATE Required for the window station to be enumerated.  WINSTA_EXITWINDOWS Required to successfully call theExitWindows orExitWindowsEx functions.  WINSTA_READATTRIBUTES Required to read the attributes of a window station object.  WINSTA_READSCREEN Required to access screen contents.  WINSTA_WRITEATTRIBUTES Required to modify the attributes of a window station object.    lpsa  Pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle can be inherited by child processes. If lpsa is NULL, the handle cannot be inherited.  The lpSecurityDescriptor member of the structure specifies a security descriptor for the new window station. If lpsa is NULL, the window station (and any desktops created within the window) gets a security descriptor that grants GENERIC_ALL access to all users.   Return Values If the function succeeds, the return value is a handle to the newly created window station. If the specified window station already exists, the function succeeds and returns a handle to the existing window station.  If the function fails, the return value is NULL. To get extended error information, call GetLastError.  QuickInfo   Windows NT: Requires version 3.51 or later.   Windows: Unsupported.   Windows CE: Unsupported.   Header: Declared in winuser.h.   Import Library: Use user32.lib.   Unicode: Implemented as Unicode and ANSI versions on Windows NT.  See Also Window Stations and Desktops Overview, Window Station and Desktop Functions, GetUserObjectInformation, OpenWindowStation

user: user-2
content: 我以前用到过一个 嵌入式的下载工具包。 这个包编写很简单，每次只能 OPEN 一个 串口来下载。 因为的它的源码里面使用了 static COMM comm 之类的数据。 不支持多线程。 也就说说这个进程只能有一个 COMM 口在运行。  而真正在工作中下载的时候，使用一个测试架，一次下载 16 个。 所以，当时我们只能使用 16 个进程来下载。类似于现在的浏览器模式。  使用 复制16 分不同名的 DLL ，如果不意外应该是可以得。 但是，我当年使用的有硬件工程师给的下载工具包，为了稳妥起见，我使用了进程。 我总觉得要求一个硬件工程师去写一个漂亮的 DLL，太无理了。

user: user-4
content: 引用 3 楼 lgmsyy 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 使用多进程。  我的描述，是不是就是多进程方式。[/quote]把你的程序用鼠标双击多次

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:使用多进程。  我的描述，是不是就是多进程方式。