天道酬勤,学无止境

multithreading

懒惰线程安全延迟加载单例的好解决方案?(Is Lazy<T> a good solution for a thread safe lazy loaded singleton?)

问题 我们在 get 上使用双重锁定实现了一个延迟加载的单例,以确保实例只初始化一次(由于线程竞争条件而不是两次)。 我想知道仅使用Lazy<T>是否是解决此问题的好方法? IE private static Lazy<MyClass> _instance = new Lazy<MyClass>(() => return new MyClass()); public static MyClass Instance { get { return _instance.Value; } } 回答1 我建议您阅读评论中的参考文章: 懒人班在 C# 中实现单例模式 在所有情况下, Lazy<T>类都是线程安全的,但您需要记住,这种类型的Value可能是线程不安全的,并且可能在多线程环境中被破坏: private static Lazy<MyClass> _instance = new Lazy<MyClass>(() => return new MyClass()); public static MyClass Instance { get { return _instance.Value; } } public void MyConsumerMethod() { lock (Instance) { // this is safe usage Instance.SomeMethod(); }

2021-09-20 19:22:35    分类:技术分享    c#   multithreading   singleton

C#中的线程(Threading in C#)

问题 只是在寻找超简单的东西。 我需要将一个方法生成到一个新线程。 我不在乎它何时或如何结束。 有人可以帮我解决这个问题吗? 谢谢 回答1 Thread thread=new Thread(() => { // thread code here }); thread.Start(); 回答2 为了在 winforms 中启动一个新线程,为简单起见, ThreadPool很难被击败: ThreadPool.QueueUserWorkItem(state => { // put whatever should be done here }); 回答3 使用 Winforms 时,您还可以使用“BackgroundWorker” 回答4 只是为了完整性......使用.Net 4.0,您拥有任务并行库。 简单的例子.... Task task = Task.Factory.StartNew(() => { ...doing stuff in a thread... }); 回答5 查看这篇关于线程池的 MDSN 文章。 这应该让您要求新线程和其他线程相关的东西。 回答6 只需查看System.Threading类的 MSDN 页面,那里就有一个简单的示例。 http://msdn.microsoft.com/en-us/library/system.threading.thread

2021-09-20 17:17:32    分类:技术分享    c#   .net   winforms   multithreading

Java thread.sleep(1) 睡眠时间超过 1 毫秒(Java thread.sleep(1) sleeping longer than 1 ms)

问题 我正在尝试使用 Java 开发 2D 游戏。 到目前为止,我已经设法将游戏设置为使用全屏独占模式并在自定义线程中进行主动渲染。 我决定使用的游戏循环是固定时间步长变量渲染类型。 这种类型的游戏循环应该以设备可以处理的速度尽可能快地呈现,我对此并不完全满意。 所以我试图使用Thread.sleep()来限制帧率。 如果我关闭所有渲染,并在游戏循环中简单地更新游戏, Thread.sleep(1)成功休眠大约1 ms 。 但是,如果我打开渲染,有时Thread.sleep(1)睡眠时间会超过1 ms ,例如15 ms 。 我通过添加/删除行来打开/关闭渲染: BufferedImage drawImage = render(Math.min(1d, lag / TIME_PER_UPDATE)); drawToScreen(drawImage); 是什么导致线程睡眠时间过长? 这是我第一次在这些论坛上发帖,所以请告诉我我的帖子是否做错了,或者这是重复的(我没有找到类似的帖子)。 import java.awt.Color; import java.awt.DisplayMode; import java.awt.Frame; import java.awt.Graphics2D; import java.awt.GraphicsDevice; import java.awt

2021-09-20 17:07:31    分类:技术分享    java   multithreading

在 Java 中同步共享静态对象的正确方法是什么?(What is the correct way to synchronize a shared, static object in Java?)

问题 这是一个关于在java中同步共享对象的正确方法是什么的问题。 一个警告是我要共享的对象必须从静态方法访问。 我的问题是,如果我在静态字段上进行同步,是否会像同步静态方法那样锁定该字段所属的类? 或者,这只会锁定字段本身吗? 在我的具体示例中,我问:调用 PayloadService.getPayload() 或 PayloadService.setPayload() 会锁定 PayloadService.payload 吗? 还是会锁定整个 PayloadService 类? public class PayloadService extends Service { private static PayloadDTO payload = new PayloadDTO(); public static void setPayload(PayloadDTO payload){ synchronized(PayloadService.payload){ PayloadService.payload = payload; } } public static PayloadDTO getPayload() { synchronized(PayloadService.payload){ return PayloadService.payload ; } } ... 这是正确

2021-09-20 16:28:14    分类:技术分享    java   multithreading   synchronization

Core Data 主上下文并发(Core Data main context concurrency)

问题 因此,在过去的几周里,我一直在阅读和使用 Core Data 的相关资料,最终我使用以下设置实现了我的 Core Data 堆栈: 保存上下文 - 在 PrivateQueue 上绑定到存储的根上下文 主上下文 - 在主线程上运行,保存上下文的子级 编辑上下文 - 在任何线程中按需创建以在后台编辑 UI 数据作为主上下文的子项 有了这个设置,我没有遇到任何问题,我已经采取了必要的预防措施来防止多个后台编辑上下文同时调用 [editMoc save],但我没有看到这相对于主线程是如何安全的/语境。 具体来说,我在使用此设置时一直看到的所有代码如下: [edit performBlock^{ [edit save:nil]; [main performBlock:^{ [main save:nil]; [root performBlock...] }]; }]; 现在我无法弄清楚的是:每次子上下文保存时,数据都会传播到主上下文,但没有任何事情发生以确保当前没有读取/操作数据在主要上下文中,对吗? 从本质上讲,我觉得这样的事情会更合适: [edit performBlock^{ dispatch_async(dispatch_get_main_queue(), ^{ [edit save:nil]; }); [main performBlock:^{ [main save:nil]

2021-09-20 15:48:17    分类:技术分享    ios   multithreading   cocoa   core-data

并发程序的性能随着线程的增加而下降?(Performance of Concurrent Program Degrading with Increase in Threads?)

问题 我一直在尝试在四核计算机上实现以下代码,并且 Executor 服务中的线程数超过 100 次迭代的平均运行时间如下 1 个线程 = 78404.95 2 个线程 = 174995.14 4 线程 = 144230.23 但是根据我所研究的内容, 2*(no of cores)线程应该为程序提供最佳结果,这在我的程序中显然不是这种情况,它奇怪地为单线程提供了最佳时间。 代码 : import java.util.Collections; import java.util.Random; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class TestHashSet { public static void main(String argv[]){ Set<Integer> S = Collections.newSetFromMap(new ConcurrentHashMap<Integer,Boolean>()); S.add(1

2021-09-20 15:44:00    分类:技术分享    java   multithreading   optimization   concurrency

为什么局部变量对于 thread::scoped 的存活时间不够长?(Why doesn't a local variable live long enough for thread::scoped?)

问题 鉴于示例 2 编译得很好,为什么示例 1 不能编译? 示例之间的唯一区别是示例 1 中的value是函数局部变量,而示例 2 中的value是函数的参数。 示例 1 #![feature(scoped)] use std::thread; use std::sync::atomic::{AtomicUsize, Ordering}; pub fn foo<F>() { let mut join_guards = Vec::new(); let value = AtomicUsize::new(0); for _ in 0..10 { join_guards.push(thread::scoped(|| { value.fetch_add(1, Ordering::SeqCst); })); } } 示例 2 #![feature(scoped)] use std::thread; use std::sync::atomic::{AtomicUsize, Ordering}; pub fn foo<F>(value: AtomicUsize) { let mut join_guards = Vec::new(); for _ in 0..10 { join_guards.push(thread::scoped(|| { value.fetch_add(1, Ordering

2021-09-20 15:01:57    分类:技术分享    multithreading   rust   lifetime

SetInterval 是否在单独的线程上运行? 该方法是如何工作的?(Does SetInterval run things on a seperate thread? How does the method work?)

问题 我环顾四周试图了解SetInterval但只找到了如何使用它。 我已经知道它的功能,我只是想知道当 JS 不支持线程时它如何能够在单独的线程上运行某些东西(至少我是这么读的)。 我希望我正确地提出了这个问题。 谢谢。 回答1 setInterval不会在不同的线程上运行任何东西。 如果JS 运行时当时空闲,它会安排某些时间运行。 您可以使用以下方法尝试这种行为: setInterval(function(){ alert("Hello"); }, 1000); while (true) { } 无限循环会阻止function运行,因为 JS 运行时卡在循环中。

2021-09-20 14:47:55    分类:技术分享    javascript   multithreading   setinterval

如何在 ForkJoinPool 中阻塞队列?(How to Block a Queue in ForkJoinPool?)

问题 当 ForkJoinPool 队列已满时,我需要在其上阻塞线程。 这可以在标准的 ThreadPoolExecutor 中完成,例如: private static ExecutorService newFixedThreadPoolWithQueueSize(int nThreads, int queueSize) { return new ThreadPoolExecutor(nThreads, nThreads, 5000L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(queueSize, true), new ThreadPoolExecutor.CallerRunsPolicy()); } 我知道,在 ForkJoinPool 中有一些 Dequeue,但我无法通过它的 API 访问它。 更新:请参阅下面的答案。 回答1 经过一番研究,我很高兴回答这个问题: 原因:由于以下原因,在 ForkJoinPool 的实现中没有这样的选项。 大多数 juc Executor 假设单个并发队列和多个线程。 这会导致队列争用并在多个线程读取/写入队列时降低性能。 因此,这样的方法不太具有可扩展性 --> 队列上的高争用会产生大量的上下文切换和 CPU 业务。 实现:在 ForkJoinPool 中

2021-09-20 14:18:08    分类:技术分享    java   multithreading   blockingqueue   fork-join   forkjoinpool

我可以在 R 中并行读取 1 个大 CSV 文件吗? [复制](Can I read 1 big CSV file in parallel in R? [duplicate])

问题 这个问题在这里已经有了答案: R:是否可以将 2000 万多行 CSV 的读取并行化/加速到 R 中? (3 个回答) 6年前关闭。 我有一个很大的 csv 文件,需要很长时间才能阅读。 我可以使用“并行”或相关的包在 R 中并行阅读吗? 我试过使用 mclapply,但它不起作用。 回答1 根据 OP 的评论,来自data.table包的fread起作用了。 这是代码: library(data.table) dt <- fread("myFile.csv") 在 OP 的情况下,使用read.csv及时读取 1.2GB 文件大约需要 4-5 分钟,而fread仅需要 14 秒。 2021 年 1 月 29 日更新:似乎fread()现在根据包创建者的推文并行工作。

2021-09-20 13:48:16    分类:技术分享    r   multithreading   csv   parallel-processing