天道酬勤,学无止境

multithreading

Relationship of "Threadsafe" with "Atomic Operation"

问题 从这里的 MSDN (http://msdn.microsoft.com/en-us/library/aa691278(v=vs.71).aspx) 可以看到 int、byte 等基本类型……都是可读/可写原子的. 所以我想知道它们都是“原子的”: “原子操作”和“锁”有什么关系? 在我看来,如果一个操作是“原子的”,我们就不再需要锁了,因为它们必须是“线程安全的”,对吗? 无论如何,网站论坛上有人告诉我,他们是对的吗? 1) 任何引用类型都是“原子操作”。 2) i++ 或 --i 等类型都不是原子操作(那么如何检查哪个操作是“原子”,哪个不是?) 我总是对这些问题感到困惑...... @Daniel Brückner 和 @keshlam: 似乎 ++i (先读/然后写)之类的混合操作不是原子操作。 但是,如果我将它们分成如下两个步骤,我会对此感兴趣: //suppose I have "i" defined and assigned a value void Fun() { if(i==1) { i=2; } } 如果上面的代码将被多个线程调用,并且“if”部分只读取(原子步骤)和“i = 2”(另一个原子步骤),那么我不需要锁? 回答1 原子操作本质上是不可中断的——只有在整个操作之前或之后,其他人都无法看到系统处于不一致状态。

2022-07-11 09:37:54    分类:技术分享    c#   multithreading   thread-safety

Make API multiple times with AsyncRestTemplate and wait for all to complete

问题 我必须使用不同参数多次使用 RestTemplate 进行 Rest API 调用。 API 是相同的,但它是正在更改的参数。 次数也是可变的。 我想使用 AsyncRestTemplate 但我的主线程应该等到所有 API 调用都成功完成。 我还想处理每个 API 调用返回的响应。 目前我正在使用 RestTemplate。 基本形式如下。 List<String> listOfResponses = new ArrayList<String>(); for (Integer studentId : studentIdsList) { String respBody; try { ResponseEntity<String> responseEntity = restTemplate.exchange(url, method, requestEntity, String.class); } catch (Exception ex) { throw new ApplicationException("Exception while making Rest call.", ex); } respBody = requestEntity.getBody(); listOfResponses.add(respBody); } 在这种情况下如何实现 AsyncRestTemplate

2022-05-17 03:37:04    分类:技术分享    java   spring   multithreading   future   asyncresttemplate

How to Monitor Qt Signal Event Queue Depth

问题 我的程序中有两个对象。 一个物体正在发出信号。 另一台接收时隙中的信号,并一一处理传入的信号。 两个对象都在不同的线程中运行。 现在我需要测量和监控接收对象的工作量。 问题是我不知道有多少信号在等待我的第二个对象在 Qt 信号队列中处理。 有没有办法获得这个队列的大小? 还是有办法知道还有多少信号需要处理? 回答1 qGlobalPostedEventsCount() 是一个起点,尽管它仅适用于当前线程。 要轮询任意线程,我们可以使用 Qt 的内部结构。 实现非常简单。 即使线程被阻塞并且不处理事件,它也可以工作。 // https://github.com/KubaO/stackoverflown/tree/master/questions/queue-poll-44440584 #include <QtCore> #include <private/qthread_p.h> #include <climits> uint postedEventsCountForThread(QThread * thread) { if (!thread) return -1; auto threadData = QThreadData::get2(thread); QMutexLocker lock(&threadData->postEventList.mutex); return

2022-05-17 03:36:09    分类:技术分享    c++   multithreading   qt   qt5

Getting SQLite3 to work with multiple threads

问题 我正在用 Python 制作一个网络爬虫,它收集重定向/链接,将它们添加到数据库中,如果链接不存在,则将它们作为新行输入。 我想使用多线程但遇到了麻烦,因为我必须实时检查是否存在具有给定 URL 的条目。 我最初使用sqlite3 ,但意识到我不能在不同的线程上同时使用它。 我真的不想使用 MySQL(或类似的东西),因为它需要更多的磁盘空间并作为单独的服务器运行。 反正有没有让sqlite3与多个线程一起工作? 回答1 Python sqlite3模块的线程安全级别为 1,这意味着虽然您不能在线程之间共享数据库连接,但多个线程可以同时使用该模块。 因此,您可以让每个线程创建自己的数据库连接。 这种方法的问题在于 SQLite 的写入并发性很差,因此让多个线程同时执行大量INSERT会给您带来可怕的“数据库已锁定”错误。 您可以通过使用 PRAGMA JOURNAL_MODE = 'WAL' 来改进一些事情,但仅此而已。 如果性能是一个问题并且切换到客户端服务器数据库不是一种选择,那么您可能需要做的是保留您的 URL 的内存缓存,并安排您的程序,以便您有一个线程将此缓存与 SQLite 数据库同步。 回答2 回答3 这是让 sqlite 在多个线程中工作的方法。 将 BlockingCollection 与 ThreadPool.QueueUserWorkItem 一起使用。

2022-05-17 01:06:04    分类:技术分享    python   multithreading   sqlite   multiprocessing

Having a function that returns int how can I run it in a separate thread using boost?

问题 回答1 回答2 线程编程101: 生成一个调用新函数(“foo”)的新线程(“thread2”)。 在生成后立即让原始线程与 thread2 连接。 读取 foo() 已将其最终值写入的全局变量。 请注意, foo() 不能将其值返回给原始线程; 它必须将值写入某个共享内存(即全局变量)。 另请注意,这不会解决您的内存泄漏问题,甚至无法明确您的内存泄漏来自何处。 使用 Valgrind 查找内存泄漏。 并阅读有关多线程的书籍或教程。 回答3 操作系统不会回收工作线程中的内存泄漏。 这不是它的工作原理。 修复你的错误。 世界不再需要任何蹩脚的软件。

2022-05-16 21:20:05    分类:技术分享    c++   multithreading   boost

When to use threading and how many threads to use

问题 我有一个工作项目。 我们编写了一个模块,并在那里作为#TODO 来实现线程以改进模块。 我是一个相当新的 python 程序员,并决定尝试一下。 在学习和实现线程时,我遇到了类似于多少线程太多的问题? 因为我们有一个大约需要处理 6 个对象的队列,所以为什么在处理时间可以忽略不计的情况下让 6 个线程(或任何线程)来处理列表或队列中的对象? (每个对象最多需要大约 2 秒来处理) 所以我做了一个小实验。 我想知道使用线程是否有性能提升。 请参阅下面的我的python代码: import threading import queue import math import time results_total = [] results_calculation = [] results_threads = [] class MyThread(threading.Thread): def __init__(self, thread_id, q): threading.Thread.__init__(self) self.threadID = thread_id self.q = q def run(self): # print("Starting " + self.name) process_data(self.q) # print("Exiting " + self.name)

2022-05-16 20:12:09    分类:技术分享    python   multithreading   python-multithreading

Android - Connect to socket in separate thread

问题 我正在尝试在 Android 中创建一个非常简单的服务器客户端应用程序。 服务器在我的电脑上运行,它是用 python 编写的。 (只是一个简单的 while (true) 循环,它接收一个字符串并用另一个字符串响应。)问题出在 Android 客户端。 所以我试图在一个单独的线程中创建一个单例类,它: 创建套接字连接到套接字可从其他活动访问写入套接字从套接字读取 我尝试从另一个异步任务中写入和读取。 它一直在工作,直到我再次尝试写入套接字。 (1次写入正常,任何其他尝试均失败。)我没有收到任何异常,我检查了套接字是否关闭或写入器为空等。消息只是没有写入套接字。 这个解决方案有什么问题? :/ 请你帮助我好吗? 这是线程: public class ConnectThread extends Thread { // singleton Part private static class ThreadHolder { static final ConnectThread instance = new ConnectThread(); } public static synchronized ConnectThread getInstance(){ if(ThreadHolder.instance == null) Log.d("mytag", "NEW INSTANCE

2022-05-16 18:51:04    分类:技术分享    android   multithreading   sockets   android-asynctask   printwriter

Why is Java Future.get(timeout) Not Reliable?

问题 Future.get(timeout) 在给定超时后不会可靠地抛出 TimeoutException。 这是正常行为还是我可以做些什么来使它更可靠? 这个测试在我的机器上失败了。 但是,如果我睡 3000 而不是 2000,它就会过去。 public class FutureTimeoutTest { @Test public void test() throws ExecutionException, InterruptedException { ExecutorService exec = Executors.newSingleThreadExecutor(); final Callable call = new Callable() { @Override public Object call() throws Exception { try { Thread.sleep(2000); } catch (InterruptedException ex) { ex.printStackTrace(); } return 0; } }; final Future future = exec.submit(call); try { future.get(1000, TimeUnit.MILLISECONDS); fail("expected TimeoutException"

2022-05-16 17:59:06    分类:技术分享    java   multithreading   timeout   java.util.concurrent

STL vector and thread-safety

问题 假设我有一个包含 N 个元素的向量,但该向量的最多 n 个元素具有有意义的数据。 一个更新线程更新第 n 个或第 n+1 个元素(然后设置 n = n+1),还检查 n 是否太接近 N 并在必要时调用 vector::resize(N+M)。 更新后,线程调用多个子线程最多读取第n个数据并进行一些计算。 保证子线程永远不会更改或删除数据,(实际上没有数据被删除)并且更新程序在完成更新后立即调用子线程。 到目前为止还没有发生任何问题,但是我想问一下,在将向量重新分配到更大的内存块的过程中是否会出现问题,如果上次更新留下了一些子工作线程。 或者在这种多线程情况下使用向量是否安全,因为它不是线程安全的? 编辑:由于只有在更新程序调用 vector::resize(N+M,0) 时才会发生插入,所以我的问题有什么可能的解决方案吗? 由于 STL 向量的出色性能,我不愿意用可锁定的向量替换它,或者在这种情况下是否有任何高性能、已知和无锁的向量? 回答1 我想问一下在将向量重新分配到更大的内存块期间是否会出现问题,如果上次更新留下了一些子工作线程。 是的,这将是非常糟糕的。 如果您正在使用来自多个线程的容器,并且至少一个线程可能会执行一些可能会修改容器状态的操作,则必须同步对容器的访问。 对于std::vector ,任何改变其大小(特别是插入和擦除)的东西都会改变其状态

2022-05-16 17:07:04    分类:技术分享    c++   multithreading   stl   vector   thread-safety

Spring threads in web app

问题 我正在为 MMO 浏览器游戏编写服务器,我需要创建几个线程。 他们将一直在运行,并有一些睡眠时间。 像这样使用弹簧螺纹是个好主意吗? @Component @Scope("prototype") public class PrintTask2 implements Runnable{ String name; public void setName(String name){ this.name = name; } @Override public void run() { System.out.println(name + " is running"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + " is running"); } } 任务执行器实现为 bean? <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="5" /> <property name="maxPoolSize"

2022-05-16 15:04:10    分类:技术分享    java   spring   multithreading   spring-mvc