[問題] 關於 llvm 的 ThreadSafeModule 的疑惑
最近在用 llvm 的 OrcJIT,要將 Module 丟進去跑之前要轉成一個叫
ThreadSafeModule 的東東,再用 llvm::orc::IRLayer add 進去
ThreadSafeModule 大概長這樣:
class ThreadSafeModule {
public:
ThreadSafeModule() = default;
ThreadSafeModule(ThreadSafeModule &&Other) = default;
ThreadSafeModule &operator=(ThreadSafeModule &&Other);
ThreadSafeModule(std::unique_ptr<Module> M, std::unique_ptr<LLVMContext> Ctx)
: M(std::move(M)), TSCtx(std::move(Ctx)) {}
ThreadSafeModule(std::unique_ptr<Module> M, ThreadSafeContext TSCtx)
: M(std::move(M)), TSCtx(std::move(TSCtx)) {}
Module *getModule() { return M.get(); }
const Module *getModule() const { return M.get(); }
ThreadSafeContext::Lock getContextLock() { return TSCtx.getLock(); }
explicit operator bool();
private:
std::unique_ptr<Module> M;
ThreadSafeContext TSCtx;
};
OrcJIT 跑完後如果中間有設 setNotifyCompiled 就會把 ThreadSafeModule 丟回來
然後 Module 就變成 ThreadSafeModule
把 ThreadSafeModule 釋放掉連帶著 Module 也釋放掉了
問題(Question):
1. 這個 ThreadSafeModule 為什麼要弄得像黑洞一樣?不把 Module release 出來
2. 它的 member function 'getModule',為什麼要寫一個有 const 一個沒有兩個版本?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.210.55
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1555143401.A.118.html
→
04/14 00:46,
5年前
, 1F
04/14 00:46, 1F
→
04/14 00:47,
5年前
, 2F
04/14 00:47, 2F
→
04/14 00:50,
5年前
, 3F
04/14 00:50, 3F
→
04/14 00:50,
5年前
, 4F
04/14 00:50, 4F
→
04/14 00:54,
5年前
, 5F
04/14 00:54, 5F
→
04/14 00:54,
5年前
, 6F
04/14 00:54, 6F
→
04/14 00:56,
5年前
, 7F
04/14 00:56, 7F
→
04/14 00:57,
5年前
, 8F
04/14 00:57, 8F
→
04/14 00:57,
5年前
, 9F
04/14 00:57, 9F
→
04/14 00:58,
5年前
, 10F
04/14 00:58, 10F
→
04/14 00:59,
5年前
, 11F
04/14 00:59, 11F
→
04/14 00:59,
5年前
, 12F
04/14 00:59, 12F
謝謝回覆,問題1的話生殺大權是拿回來了,不過變成另一種東西...有一種被強迫的感覺
問題2呢,想一想的確從 const 物件拿出來的東西,既然交給它管了那也該是 const。不
過「const T& 在你 statement 結束前保證的語意是 "物件一直都存在"」有點難懂,是
說 reference 到一個 const T,這個 reference 一直都有效的意思?
※ 編輯: Lipraxde (140.113.56.71), 04/14/2019 11:48:26
→
04/14 16:21,
5年前
, 13F
04/14 16:21, 13F
→
04/14 16:23,
5年前
, 14F
04/14 16:23, 14F
→
04/14 16:24,
5年前
, 15F
04/14 16:24, 15F
→
04/14 16:26,
5年前
, 16F
04/14 16:26, 16F
→
04/14 16:28,
5年前
, 17F
04/14 16:28, 17F
→
04/14 16:29,
5年前
, 18F
04/14 16:29, 18F
→
04/14 16:57,
5年前
, 19F
04/14 16:57, 19F
→
04/14 16:58,
5年前
, 20F
04/14 16:58, 20F
→
04/14 16:59,
5年前
, 21F
04/14 16:59, 21F
→
04/14 16:59,
5年前
, 22F
04/14 16:59, 22F
例子我懂了, const T& 延長了那個暫時物件的 lifetime,保證它一定存在
不過它這裡是 getModule 是傳回 pointer 耶,用 pointer 會有保證的效果嗎?
多個 thread 的情況,要獲得保證一定要先呼叫 getContextLock 才行吧?
※ 編輯: Lipraxde (140.113.56.71), 04/14/2019 20:29:06
→
04/14 21:08,
5年前
, 23F
04/14 21:08, 23F
→
04/14 21:09,
5年前
, 24F
04/14 21:09, 24F
→
04/14 21:09,
5年前
, 25F
04/14 21:09, 25F
→
04/14 21:10,
5年前
, 26F
04/14 21:10, 26F
→
04/14 21:11,
5年前
, 27F
04/14 21:11, 27F
→
04/14 21:11,
5年前
, 28F
04/14 21:11, 28F
→
04/14 21:14,
5年前
, 29F
04/14 21:14, 29F
→
04/14 21:14,
5年前
, 30F
04/14 21:14, 30F
→
04/14 21:15,
5年前
, 31F
04/14 21:15, 31F
假如是用 int& 就沒有這個保證了嗎?
我看了 Lifetime of temporaries bound to references,裡面寫到:
For any statement explicitly binding a reference to a temporary, the lifetime
of all temporaries in the statement are extended to match the lifetime of the
reference.
似乎跟有沒有 const 修飾沒有關係呀,還是說這個是在講不同的事?
※ 編輯: Lipraxde (140.113.56.71), 04/15/2019 00:03:32
→
04/15 00:09,
5年前
, 32F
04/15 00:09, 32F
→
04/15 00:10,
5年前
, 33F
04/15 00:10, 33F
→
04/15 00:10,
5年前
, 34F
04/15 00:10, 34F
→
04/15 00:11,
5年前
, 35F
04/15 00:11, 35F
→
04/15 00:42,
5年前
, 36F
04/15 00:42, 36F
→
04/15 00:43,
5年前
, 37F
04/15 00:43, 37F
→
04/15 00:44,
5年前
, 38F
04/15 00:44, 38F
→
04/15 00:45,
5年前
, 39F
04/15 00:45, 39F
→
04/15 00:45,
5年前
, 40F
04/15 00:45, 40F
→
04/15 00:46,
5年前
, 41F
04/15 00:46, 41F
就我對 reference 的理解來說:
int& // 參考到某個 int
const int& // 參考到某個 const int
考慮到 lifetime 的保證,那就是:
int& // 參考到某個 int,這個參考可能在某個時間點後就不能相信它了
const int& // 參考到某個 const int,由於目標是個 const,不會變,所以【可以/要】
// 保證這個參考有效
是說這個 const 用來修飾 int,為什麼要去影響 reference 的有效性?
可以保證有效,但是一定要做出這個保證?
※ 編輯: Lipraxde (140.113.56.71), 04/15/2019 02:13:02
→
04/15 02:58,
5年前
, 42F
04/15 02:58, 42F
→
04/15 02:59,
5年前
, 43F
04/15 02:59, 43F
→
04/15 03:00,
5年前
, 44F
04/15 03:00, 44F
→
04/15 03:01,
5年前
, 45F
04/15 03:01, 45F
→
04/15 03:02,
5年前
, 46F
04/15 03:02, 46F
→
04/15 03:02,
5年前
, 47F
04/15 03:02, 47F
→
04/15 03:02,
5年前
, 48F
04/15 03:02, 48F
→
04/15 03:05,
5年前
, 49F
04/15 03:05, 49F
→
04/15 03:05,
5年前
, 50F
04/15 03:05, 50F
→
04/15 03:13,
5年前
, 51F
04/15 03:13, 51F
→
04/15 03:13,
5年前
, 52F
04/15 03:13, 52F
→
04/15 03:13,
5年前
, 53F
04/15 03:13, 53F
→
04/15 03:13,
5年前
, 54F
04/15 03:13, 54F
→
04/15 03:33,
5年前
, 55F
04/15 03:33, 55F
→
04/15 03:40,
5年前
, 56F
04/15 03:40, 56F
→
04/15 03:40,
5年前
, 57F
04/15 03:40, 57F
→
04/15 03:40,
5年前
, 58F
04/15 03:40, 58F
→
04/15 03:53,
5年前
, 59F
04/15 03:53, 59F
→
04/15 03:58,
5年前
, 60F
04/15 03:58, 60F
→
04/15 03:59,
5年前
, 61F
04/15 03:59, 61F
→
04/15 04:04,
5年前
, 62F
04/15 04:04, 62F
→
04/15 04:04,
5年前
, 63F
04/15 04:04, 63F
→
04/15 04:04,
5年前
, 64F
04/15 04:04, 64F
→
04/15 04:04,
5年前
, 65F
04/15 04:04, 65F
→
04/15 04:14,
5年前
, 66F
04/15 04:14, 66F
→
04/15 04:15,
5年前
, 67F
04/15 04:15, 67F
感謝您花這麼多時間回覆,看來是因為 C 沒有 owning 語意,我又忽略掉 const[A 還有
"存取的一致性" 這層意義,才會出現問題2。我應該把 C++ 當門新的語言學才是
※ 編輯: Lipraxde (140.113.56.71), 04/15/2019 20:59:08
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章