Tag: multithreading

线程本地存储为什么这么慢?

我正在为D编程语言的自定义标记释放样式内存分配器工作,通过从线程本地区域分配。 看起来线程局部存储瓶颈导致了从这些区域分配内存的速度(〜50%)相比于其他相同的单线程版本的代码,甚至在devise我的代码后,每个分配/释放。 这是基于在一个循环中分配/释放内存很多次,我正在试图弄清楚它是否是我的基准testing方法的人为因素。 我的理解是线程本地存储基本上只需要通过一个额外的间接层来访问某些东西,类似于通过指针访问一个variables。 这是不正确的? 线程本地存储通常有多less开销? 注意:尽pipe我提到了D,但是我也对D中没有特定的一般答案感兴趣,因为如果D的实现比最好的实现慢,D的线程本地存储的实现可能会改进。

可以从工作线程调用NoticationManager.notify()吗?

我的问题更多的是什么是一个好的做法,而不是可能的: 从工作线程调用NoticationManager.notify()是否是件好事? 无论如何,系统是否在UI线程中执行它? 我总是试着记住,关于UI的东西应该在UI线程中执行,其余的在工作线程中执行,正如关于进程和线程的Android文档所build议的: 另外,Andoid UI工具包不是线程安全的。 所以,你不能从一个工作者线程操纵你的UI – 你必须从UI线程对你的用户界面进行所有的操作。 因此,Android的单线程模型只有两条规则: 不要阻塞UI线程 不要从UI线程之外访问Android UI工具包 然而,我对Android文档本身给出的一个例子感到惊讶( 关于通知的进展情况),其中一个持续的通知进度直接从工作者线程更新: mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mBuilder = new NotificationCompat.Builder(this); mBuilder.setContentTitle("Picture Download") .setContentText("Download in progress") .setSmallIcon(R.drawable.ic_notification); // Start a lengthy operation in a background thread new Thread( new Runnable() { @Override public void run() { int incr; // Do the "lengthy" operation […]

Thread.Start()与ThreadPool.QueueUserWorkItem()

Microsoft .NET Base Class Library提供了几种创build线程的方法并启动它。 基本上,调用与提供相同types的服务的每一个非常相似:创build一个表示执行stream(或更多)的对象,为其分配一个表示要执行的执行stream的委托,并最终根据委托签名,作为参数。 那么,有两种方法(基本上): 1)使用System.Threading.Thread类。 Thread curr = new Thread(myfunction); /* In a class, myfunction is a void taking an object */ curr.Start(new Object()); /* Or something else to be downcast */ 2)使用System.Threading.ThreadPool类。 ThreadPool.QueueUserWorkItem(myfunction, new Object()); /* Same philosophy here */ 有什么特别的原因,我应该使用1)或2)? 性能的原因? 模式? 什么是最好的方法? 我有一种感觉,答案是:“依情况而定”。 你可以列举一种方法比另一种更好的情况吗?

为什么要使用处理程序而runOnUiThread也一样?

我遇到了Handler和runOnUiThread两个概念。 但对我来说,它似乎仍然是一个疑问,因为它们究竟在哪些事实上有所不同。 他们都打算从后台线程做UI操作。 但是我们select这两种方法时要考虑哪些因素呢? 例如,考虑一个在后台执行Web服务的可运行Thread ,现在我想更新UI。 什么是最好的方式来更新我的用户界面? 我应该去Handler或runOnUiThread ? 我仍然知道我可以使用AsyncTask并使用onPostExecute 。 但我只想知道其中的差别。

提示,以防止java中的死锁

我正在学习java线程和死锁,我理解死锁的例子,但是我想知道是否有通用的规则来阻止它。 我的问题是,如果有规则或技巧,可以应用到Java中的源代码,以防止死锁? 如果是的话,你能解释一下如何实现它吗?

C ++ 11线程安全队列

我正在使用的一个项目使用多个线程来处理文件的集合。 每个线程都可以将文件添加到要处理的文件列表中,所以我放在一起(我以为是)一个线程安全的队列。 相关部分如下: // qMutex is a std::mutex intended to guard the queue // populatedNotifier is a std::condition_variable intended to // notify waiting threads of a new item in the queue void FileQueue::enqueue(std::string&& filename) { std::lock_guard<std::mutex> lock(qMutex); q.push(std::move(filename)); // Notify anyone waiting for additional files that more have arrived populatedNotifier.notify_one(); } std::string FileQueue::dequeue(const std::chrono::milliseconds& timeout) […]

在foreach中启动任务循环使用最后一项的值

我正在尝试玩新的任务,但有些事情我不明白。 首先,代码非常简单。 我传递一些path到一些图像文件,并尝试添加一个任务来处理它们中的每一个: public Boolean AddPictures(IList<string> paths) { Boolean result = (paths.Count > 0); List<Task> tasks = new List<Task>(paths.Count); foreach (string path in paths) { var task = Task.Factory.StartNew(() => { Boolean taskResult = ProcessPicture(path); return taskResult; }); task.ContinueWith(t => result &= t.Result); tasks.Add(task); } Task.WaitAll(tasks.ToArray()); return result; } 我发现,如果我让这个运行,比如一个unit testing中的3个path列表,所有这三个任务都使用提供的列表中的最后一个path。 如果我一步一步(并减慢循环的处理),则使用循环中的每条path。 有人可以解释发生了什么,为什么? 可能的解决方法?

Android定时器时间表vs scheduleAtFixedRate

我正在编写一个每10分钟loggingaudio的Android应用程序。 我正在使用一个计时器来做到这一点。 但是schedule和scheduleAtFixedRate有什么区别呢? 使用其中一个有什么性能好处吗?

我怎样才能写一个无锁结构?

在我的multithreading应用程序中,我看到了严重的锁争用,阻止了多核心之间的良好可伸缩性。 我决定使用无锁编程来解决这个问题。 我怎样才能写一个无锁结构?

在多个线程中独立运行Boehm GC

我正在试着写一些与Rust的Boehm GC 绑定 。 一些背景知识:Rust被devise成高并发语言,并且这种devise的结果是能够静态地限制GC指针到它们被分配的线程中(也就是说,在线程x中分配的GC指针可以永远不会被另一个线程保持活着(或者甚至被引用)。 因此,我希望推动Boehm尽可能地利用这个performance: 线程安全的,所以我可以从多个线程分配和收集 停止尽可能less的集合(即只是当前线程),其他线程可以继续运行,因为它们不可能干扰与自己之外的GC指针相关的任何事情 优选地,完全线程化地在不同线程的GC“实例”之间不同步 1很容易,但我找不到任何2和3的设施。最重要的部分是1和2,因为我希望能够在后台运行线程,而不pipe其他线程在做什么(即使他们都分配和垃圾收集千兆字节的内存)。 (我知道THREAD_LOCAL_ALLOC & gc_thread_local.h ,但是这并不完全满足3,它只是使它更有效率,但它仍然是有效的线程间传递线程分配的指针,而我不需要那保证。)