Multithreading 使用来自不同线程的共享内存

Multithreading 使用来自不同线程的共享内存,multithreading,swift,Multithreading,Swift,我对多线程有一个奇怪的问题。我想打印一个表视图,从而启动一个新线程,该线程使用进度条运行。最终,这个线程由于内存错误而死亡,我正在寻找原因。现在我有 malloc:*对象0x10000078c的错误:的签名无效 从空闲列表中退出队列的指针 在malloc\u error\u break中设置断点以调试CaLister27054,0x7fff73ea3300对象的malloc:error 0x6080043BCC0:无效指针已从可用列表中退出队列 *在malloc\u error\u break中

我对多线程有一个奇怪的问题。我想打印一个表视图,从而启动一个新线程,该线程使用进度条运行。最终,这个线程由于内存错误而死亡,我正在寻找原因。现在我有

malloc:*对象0x10000078c的错误:的签名无效 从空闲列表中退出队列的指针 在malloc\u error\u break中设置断点以调试CaLister27054,0x7fff73ea3300对象的malloc:error 0x6080043BCC0:无效指针已从可用列表中退出队列 *在malloc\u error\u break中设置断点以进行调试

但大多数时候,这种情况仍然很少发生!它只是停止,没有特定的但肯定与内存相关的错误。当我从调试器中查看时,我的数据为零。但是,由于它们仍然可以在我的表视图中显示,所以没有触摸它们

现在的问题是:我需要采取什么预防措施来访问在主线程中分配的数据,以便可以从分离的线程安全地访问它们

编辑: 我的打印线程被调度为以下代码:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { self.performPrint  (true) }

func  performPrint (async:Bool) {
  //First get the shared print info object so we know page sizes.  The shared print info object acts like a global variable.
  let sharedPrintInfo = NSPrintInfo.sharedPrintInfo()

  let printObject = PSPrint ()

  //Allocate a new instance of NSView into the variable printPageView
  var frame = NSRect(x: 0, y: 0, width: sharedPrintInfo.paperSize.width-sharedPrintInfo.leftMargin-sharedPrintInfo.rightMargin, height: sharedPrintInfo.paperSize.height-sharedPrintInfo.topMargin-sharedPrintInfo.bottomMargin)
  let basePrintPageView = PSPrintView(frame: frame)

  var printPageView:PSPrintView
  for pageNo in 1...paperDimensions.pages {
    paperDimensions.pageNo = pageNo

    printPageView = basePrintPageView.clone(pageNo)

    //Set the option for the printView for what it should draw.
    paperDimensions.pageNo = pageNo

    //Finally append the view to the PSPrint Object.
    printObject.printViews.append(printPageView)
  }
  dispatch_async(dispatch_get_main_queue()) {
    printObject.printTheViews() //print all the views, each view being a 'page'.
  }
}

printPageView = basePrintPageView.clone(pageNo)
访问要打印的数据所在的表视图时,有时返回nil


Edit2:我只是注意到崩溃的不是背景线程,而是主线程:-/我甚至抓挠了头,但我可能不得不结束这个问题。

除非你发布所有相关代码,否则我们根本帮不了你。@Duncac,正如我所说,这不是一个小地方。我希望能找到一些我错过的共享内存锁定机制。很可能这只是一个编译器/OS错误,因为我自己没有分配内存。因此,我无法解释为什么分离的线程在主线程仍然从仍然存在的表视图中找到/应该找到其数据的地方找到nil。您可以在后台线程中使用ViewObject。>//将NSView的新实例分配到变量printPageView中,您只能在主线程中操作UI。您应该计算数据并传递到主线程以显示它。您不需要复制内存。内存在所有线程/进程之间共享。您需要做的是确保如果一个线程正在向内存写入,那么没有其他线程正在向同一内存读写。为此,你需要锁。系统API从后台线程分配的内存也是如此。很多系统API在后台线程中是不安全的。几乎所有的UIKit都不是线程安全的。