Tag: multithreading

你将如何在C ++ 11中实现自己的读写器locking?

我有一套数据结构,需要使用读写器锁保护。 我知道boost :: shared_lock,但我想有一个使用std :: mutex,std :: condition_variable和/或std :: atomic的自定义实现,以便我可以更好地理解它是如何工作的(并稍后调整它) 。 每个数据结构(可移动,但不可复制)将从一个称为Commons的类inheritance,该类封装了locking。 我想公共界面看起来像这样: class Commons { public: void read_lock(); bool try_read_lock(); void read_unlock(); void write_lock(); bool try_write_lock(); void write_unlock(); }; …所以它可以被一些公开的inheritance: class DataStructure : public Commons {}; 我正在写科学的代码,通常可以避免数据竞赛; 这个锁主要是防止我以后可能会犯的错误。 因此我的优先级是低的读取开销,所以我不会妨碍正确运行的程序太多。 每个线程都可能运行在自己的CPU内核上。 你能告诉我(伪代码是好的)读者/写作者锁? 我现在所拥有的应该是防止作家饥饿的变种。 到目前为止,我的主要问题是read_lock在检查read是否安全以实际递增读取器计数之间的差距,之后write_lock知道要等待。 void Commons::write_lock() { write_mutex.lock(); reading_mode.store(false); while(readers.load() > 0) {} } void […]

我的自旋锁实现是否正确和最佳?

我正在使用旋转锁来保护非常小的关键部分。 争用很less发生,所以自旋锁比普通的互斥锁更合适。 我现在的代码如下,并假定x86和GCC: volatile int exclusion = 0; void lock() { while (__sync_lock_test_and_set(&exclusion, 1)) { // Do nothing. This GCC builtin instruction // ensures memory barrier. } } void unlock() { __sync_synchronize(); // Memory barrier. exclusion = 0; } 所以我想知道: 这段代码是否正确? 它是否正确确保相互排斥? 它是否适用于所有x86操作系统? 它也可以在x86_64上运行吗? 在所有操作系统上? 这是最佳的吗? 我已经看到使用比较和交换的自旋锁实现,但我不知道哪个更好。 根据GCCprimefacesbuild立的文档( http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html )还有__sync_lock_release 。 我不是内存障碍方面的专家,所以我不确定是否可以使用这个来代替__sync_synchronize 。 我正在优化的情况下,没有争议。 我根本不在意争论。 […]

Java中的线程安全单例

关于Singletons的维基百科文章提到了一些线程安全的方法来实现Java中的结构。 对于我的问题,让我们考虑具有冗长的初始化过程的单身人士,并一次由许multithreading共享。 首先,这个未提到的方法是线程安全的,如果是的话,它是同步的? public class Singleton { private Singleton instance; private Singleton() { //lots of initialization code } public static synchronized Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } } 其次,为什么下面的实现线程安全和初始化懒? 如果两个线程同时进入getInstance()方法,会发生什么? public class Singleton { private Singleton() { //lots of initialization code } private static class SingletonHolder […]

locking一个对象被多个线程访问 – Objective-C

在Objective-C中,我有一个关于线程安全性的问题。 我已经阅读了一些其他的答案,一些苹果的文档,并仍然有一些怀疑,所以想我会问自己的问题。 我的问题是三重 : 假设我有一个数组, NSMutableArray *myAwesomeArray; 折叠1: 现在纠正我,如果我错了,但从我的理解,使用@synchronized(myAwesomeArray){…}将阻止两个线程访问相同的代码块。 所以,基本上,如果我有这样的东西: -(void)doSomething { @synchronized(myAwesomeArray) { //some read/write operation on myAwesomeArray } } 那么,如果两个线程同时访问同一个方法,那么这个代码块将是线程安全的。 我猜我已经正确地理解了这个部分。 折叠2: 如果myAwesomeArray被来自不同方法的多个线程访问,我该怎么办? 如果我有这样的东西: – (void)readFromArrayAccessedByThreadOne { //thread 1 reads from myAwesomeArray } – (void)writeToArrayAccessedByThreadTwo { //thread 2 writes to myAwesomeArray } 现在,两个方法同时被两个不同的线程访问。 我如何确保myAwesomeArray不会有问题? 我使用类似NSLock或NSRecursiveLock? 折3: 现在,在上述两种情况下, myAwesomeArray是内存中的一个iVar。 如果我有一个数据库文件,我不会一直保存在内存中。 每当我想执行数据库操作时,我都会创build一个databaseManagerInstance ,并在完成后释放它。 因此,基本上,不同的类可以访问数据库。 每个类创build自己的DatabaseManger实例,但基本上它们都使用相同的单个数据库文件。 […]

如何使用张量stream中的自定义python函数预取数据

我正在尝试预取训练数据以隐藏I / O延迟。 我想写自定义的Python代码,从磁盘加载数据并预处理数据(例如通过添加上下文窗口)。 换句话说,一个线程进行数据预处理,另一个线程进行训练。 这在TensorFlow中可能吗? 更新:我有一个基于@ mrry示例的工作示例。 import numpy as np import tensorflow as tf import threading BATCH_SIZE = 5 TRAINING_ITERS = 4100 feature_input = tf.placeholder(tf.float32, shape=[128]) label_input = tf.placeholder(tf.float32, shape=[128]) q = tf.FIFOQueue(200, [tf.float32, tf.float32], shapes=[[128], [128]]) enqueue_op = q.enqueue([label_input, feature_input]) label_batch, feature_batch = q.dequeue_many(BATCH_SIZE) c = tf.reshape(feature_batch, [BATCH_SIZE, 128]) + tf.reshape(label_batch, [BATCH_SIZE, […]

ContentProvider insert()总是在UI线程上运行?

我有一个应用程序需要从服务器提取数据,并将其插入SQLite数据库以响应用户input。 我认为这将是非常简单的 – 从服务器获取数据的代码是AsyncTask的一个相当简单的子类,它的工作原理与我预期的一样,不需要挂接UI线程。 我用一个简单的接口为它实现了callback函数,并将其封装在一个静态类中,所以我的代码如下所示: MyServerCaller.getFolderContents(folderId, new OnFolderContentsResponseListener() { @Override public void onFolderContentsResponse(final List<FilesystemEntry> contents) { // do something with contents } } 一切还好。 即使服务器需要一个小时来检索数据,但UI仍然运行平稳,因为getFolderContents中的代码正在AsyncTask的doInBackground方法中运行(与UI分离)。 在getFolderContents方法的最后,调用onFolderContentsResponse并传递从服务器接收到的FilesystemEntry列表。 我只是说这一切,所以希望清楚,我的问题不在getFolderContents方法或任何我的networking代码,因为它不会发生在那里。 当我尝试通过onFolderContentsResponse方法内的ContentProvider的子类插入到数据库时出现问题; 用户界面总是挂起,而代码执行,导致我相信,尽pipe从AsyncTask的doInBackground方法调用,插入仍然在UI线程上运行。 以下是有问题的代码: MyServerCaller.getFolderContents(folderId, new OnFolderContentsResponseListener() { @Override public void onFolderContentsResponse(final List<FilesystemEntry> contents) { insertContentsIntoDB(contents); } } 和insertContentsIntoDB方法: void insertContentsIntoDB(final List<FilesystemEntry> contents) { for (FilesystemEntry entry : contents) […]

Python中的multithreadingWeb服务器

我试图在python中创buildmultithreading的Web服务器,但它只响应一个请求,我不知道为什么。 你能帮我吗? #!/usr/bin/env python2 # -*- coding: utf-8 -*- from SocketServer import ThreadingMixIn from BaseHTTPServer import HTTPServer from SimpleHTTPServer import SimpleHTTPRequestHandler from time import sleep class ThreadingServer(ThreadingMixIn, HTTPServer): pass class RequestHandler(SimpleHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header('Content-type', 'text/plain') sleep(5) response = 'Slept for 5 seconds..' self.send_header('Content-length', len(response)) self.end_headers() self.wfile.write(response) ThreadingServer(('', 8000), RequestHandler).serve_forever()

如何在iOS Swift中实现multithreading,并发或并行?

有什么办法可以在Swift中创build一个工作线程?例如,如果有一个主要的function需要大量的计算,并因此导致主线程延迟几秒钟,如果我想将该function移动到单独的线程或不阻塞主线程的线程有没有办法用Swift做到这一点? 我已经浏览了Swift的Apple文档的基本和高级组件,但没有提及并发性或并行性,有谁知道如何做(如果可能)?

如何从Python线程退出整个应用程序?

我如何退出我的整个Python应用程序的一个线程? sys.exit()只会终止它被调用的线程,所以这没有帮助。 我不想使用os.kill()解决scheme,因为这不是很干净。

单螺纹公寓vs多螺纹公寓

可能重复: 你能解释STA和MTA吗? 所有ThreadPool线程都在multithreading的公寓中。 – 根据MSDN 那是什么意思? 我真的关心multithreading与单线程模式的区别。 或者公寓模式是什么意思? 我已经阅读了MSDN,这对我来说并不合适。 我想我可能有一个想法,但我想在这里的人可以用简单的英语来解释。 谢谢,安东尼D 更新1 find这个可以解释STA和MTA吗? 任何人都可以更具描述性? 更新2 我也在寻找关于如何适用于线程池的答案,以及因此需要注意的问题。