【问题标题】:beginWriteTransaction from multithreading来自多线程的 beginWriteTransaction
【发布时间】:2016-04-26 09:44:37
【问题描述】:

根据 beginWriteTransaction 方法中的文档

一次只能打开一个写事务。写交易 不能嵌套,并试图在一个 已经在写事务中的 RLMRealm 将抛出一个 例外。从 RLMRealm 实例调用 beginWriteTransaction 其他线程将阻塞直到当前的写事务 完成。

但是当我查看代码时,我发现了下一个:

void Realm::begin_transaction()
{
   check_read_write(this);
   verify_thread();

   if (is_in_transaction()) {
      throw InvalidTransactionException("The Realm is already in a write transaction");
   }

   // make sure we have a read transaction
    read_group();

    transaction::begin(*m_shared_group, m_binding_context.get());
}

你能解释一下什么时候满足条件吗?

从其他 RLMRealm 实例调用 beginWriteTransaction 线程将阻塞,直到当前的写事务完成。

【问题讨论】:

    标签: multithreading realm


    【解决方案1】:

    最后一次调用将导致一个方法离开这个中间的跨平台 C++ API 级别并深入到我们的内部存储引擎中,它使用互斥锁来协调进程和线程之间的独占访问。
    一旦获取了这个互斥体,它就会一直保持到写入事务被提交或取消。

    【讨论】:

    • 当我尝试从 2 个线程写入默认领域时,您有一些解决方案如何解决问题?现在我只有一个解决方案:1)dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL) 2)并将所有交易包装在块中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2019-06-07
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多