Câu hỏi của tôi, như tiêu đề được đề cập, là hiển nhiên và tôi mô tả chi tiết về kịch bản. Có một lớp có tên singleton thực hiện bởi Singleton pattern như sau, trong tập tin singleton.h:Nhiều trường hợp singleton trên các thư viện được chia sẻ trên Linux
/*
* singleton.h
*
* Created on: 2011-12-24
* Author: bourneli
*/
#ifndef SINGLETON_H_
#define SINGLETON_H_
class singleton
{
private:
singleton() {num = -1;}
static singleton* pInstance;
public:
static singleton& instance()
{
if (NULL == pInstance)
{
pInstance = new singleton();
}
return *pInstance;
}
public:
int num;
};
singleton* singleton::pInstance = NULL;
#endif /* SINGLETON_H_ */
sau đó, có một plugin gọi hello.cpp như sau:
#include <iostream>
#include "singleton.h"
extern "C" void hello() {
std::cout << "singleton.num in hello.so : " << singleton::instance().num << std::endl;
++singleton::instance().num;
std::cout << "singleton.num in hello.so after ++ : " << singleton::instance().num << std::endl;
}
bạn có thể nhìn thấy rằng plugin gọi singleton và thay đổi thuộc tính num trong singleton.
cuối cùng, có một chức năng chính sử dụng singleton và các plugin như sau:
#include <iostream>
#include <dlfcn.h>
#include "singleton.h"
int main() {
using std::cout;
using std::cerr;
using std::endl;
singleton::instance().num = 100; // call singleton
cout << "singleton.num in main : " << singleton::instance().num << endl;// call singleton
// open the library
void* handle = dlopen("./hello.so", RTLD_LAZY);
if (!handle) {
cerr << "Cannot open library: " << dlerror() << '\n';
return 1;
}
// load the symbol
typedef void (*hello_t)();
// reset errors
dlerror();
hello_t hello = (hello_t) dlsym(handle, "hello");
const char *dlsym_error = dlerror();
if (dlsym_error) {
cerr << "Cannot load symbol 'hello': " << dlerror() << '\n';
dlclose(handle);
return 1;
}
hello(); // call plugin function hello
cout << "singleton.num in main : " << singleton::instance().num << endl;// call singleton
dlclose(handle);
}
và makefile là sau đây:
example1: main.cpp hello.so
$(CXX) $(CXXFLAGS) -o example1 main.cpp -ldl
hello.so: hello.cpp
$(CXX) $(CXXFLAGS) -shared -o hello.so hello.cpp
clean:
rm -f example1 hello.so
.PHONY: clean
như vậy, đầu ra là bao nhiêu? Tôi nghĩ đó là sau đây:
singleton.num in main : 100
singleton.num in hello.so : 100
singleton.num in hello.so after ++ : 101
singleton.num in main : 101
Tuy nhiên, sản lượng thực tế là sau đây:
singleton.num in main : 100
singleton.num in hello.so : -1
singleton.num in hello.so after ++ : 0
singleton.num in main : 100
Nó chứng tỏ rằng có hai trường hợp của lớp singleton.
Tại sao?
Bạn có muốn đĩa đơn này là singleton cho một quá trình bạn đang thực hiện không? Hoặc một singleton "toàn hệ thống" vi phạm tất cả bộ nhớ được bảo vệ đó cung cấp cho chúng ta? – sarnold
Câu hỏi, trừ khi được tuyên bố rõ ràng, thường là bất cứ điều gì nhưng hiển nhiên. Bạn có muốn chia sẻ các thư viện để chia sẻ singleton hay không?Bạn có lý thuyết về một trong hai hành vi hoặc thực sự trải nghiệm nó? Không có cách nào để biết trừ khi bạn nói với chúng tôi. – 9000
@ sarnold: có một mẫu nổi tiếng của các hệ thống toàn bộ hệ thống không bị giới hạn bởi không gian địa chỉ: nó được gọi là máy chủ. Nhưng cho đến khi áp phích ban đầu báo cho _purpose_ mã của anh ta, thật khó để nói liệu mẫu này có phù hợp hay không. – 9000