多线程是计算机或程序通过利用多个并发执行流(通常称为线程)同时或异步执行工作的能力。
C++11:Linux 上的 std::thread 是否依赖于 pthread 库?
我读到 pthread 是 C 库,与 C++ 对象模型不兼容,特别是在谈论异常处理时。 所以我想知道在linux系统上,gcc/clang如何实现std::thr...
如何从Python中的另一个线程中止socket.recv()
我有一个等待连接的主线程。它生成客户端线程,该线程将回显来自客户端的响应(在本例中为 telnet)。但是说我想关闭所有套接字和所有...
使用此代码示例使用 std::function 和 std::bind 为以下代码添加多线程回调机制。 void MyClass::afterCompleteCallback(字符串 stsstr) { CString strResult...
我正在编写一个端口扫描仪,无法创建流畅的用户界面。 我有一个显示扫描结果的 DataGrid: 我正在编写一个端口扫描器,无法创建流畅的 UI。 我有一个显示扫描结果的DataGrid: <DataGrid Grid.Column="0" ItemsSource="{Binding NetScanResults}" Margin="5" AutoGenerateColumns="False" IsReadOnly="True"> 然后我有一个保存扫描结果的对象。 public class NetScanResult : ObservableObject { private IPAddress ipAddress; public IPAddress IpAddress { get => ipAddress; set { SetProperty(ref ipAddress, value); OnPropertyChanged(nameof(IpAddressStr)); } } private ObservableCollection<int> openPorts; public ObservableCollection<int> OpenPorts { get => openPorts; set { SetProperty(ref openPorts, value); } } public NetScanResult() { OpenPorts = new ObservableCollection<int>(); } } 最后我有了一个扫描逻辑: [RelayCommand] public async void NetScan2Start() { try { int[] ports = { 22, 80, 443, 554, 3389, 8000, 37777 }; int timeoutMs = 2500; var stopwatch = new Stopwatch(); stopwatch.Start(); var netScanResults = await NetUtility.ScanNetwork2_Prepare(NetScanIpRangeBegin, NetScanIpRangeEnd, NetScanNetmaskSelected, ports, timeoutMs); NetScanResults = new ObservableCollection<NetScanResult>(netScanResults); var tasks = new List<Task>(); foreach (var netScanResult in NetScanResults) { foreach (var port in ports) { NetScanResult tempResult = netScanResult; int tempPort = port; var task = ScanPortAsync(tempResult, tempPort, timeoutMs); tasks.Add(task); } } await Task.WhenAll(tasks.ToArray()); stopwatch.Stop(); MessageBox.Show($"Scan finished in {stopwatch.ElapsedMilliseconds}ms"); } catch (Exception ex) { ShowInvalidData(ex.Message); return; } } private async Task ScanPortAsync(NetScanResult result, int port, int timeoutMs) { try { Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp); var connectResult = socket.BeginConnect(result.IpAddress, port, null, null); await Task.Run(() => { connectResult.AsyncWaitHandle.WaitOne(timeoutMs, true); }); if (socket.Connected) { socket.EndConnect(connectResult); Application.Current.Dispatcher.Invoke(() => { result.OpenPorts.Add(port); }); Debug.WriteLine($"{result.IpAddress}:{port} - open."); } socket.Close(); } catch (Exception ex) { Debug.WriteLine($" Exception happened =( - {ex.Message}"); } } 我开始很顺利,但一段时间后用户界面仍然冻结,我不明白为什么。 当所有扫描线程完成后,它就会解冻。 我错过了什么? 我没有从你的代码中看出你为什么使用ObservableCollection。您无需对任何地方的这些集合进行任何更改。你完全形成它们,然后才将它们归还。在我看来,这里很有可能使用“只读”集合。 我也认为不需要使用 Dispatcher 或其他细微差别来使用可变属性。扫描结果被分配给一些难以理解的东西 - 它实际上被发送到垃圾箱。同步和异步代码以一种难以想象的方式混合在一起。 我建议您从根本上改变执行任务的方法。 看一下这个示例 - 由于您没有显示与实现相关的所有代码,因此该示例基于猜测,可能并不完全准确: public class NetScanResult : ObservableObject { public IPAddress IpAddress { get; } public IReadOnlyList<int> OpenPorts { get; } public NetScanResult(IPAddress ipAddress, IEnumerable<int> openPorts) { IpAddress = ipAddress; OpenPorts = Array.AsReadOnly(openPorts?.ToArray() ?? Array.Empty<int>()); } } private async Task<int> ScanPortAsync(/*NetScanResult result,*/ IPAddress ipAddress, int port, int timeoutMs) => await Task.Run(() => { try { Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp); var connectResult = socket.BeginConnect(/*result.IpAddress,*/ipAddress, port, null, null); //await Task.Run(() => { connectResult.AsyncWaitHandle.WaitOne(timeoutMs, true); }); connectResult.AsyncWaitHandle.WaitOne(timeoutMs, true); if (socket.Connected) { socket.EndConnect(connectResult); //Application.Current.Dispatcher.Invoke(() => //{ // result.OpenPorts.Add(port); //}); Debug.WriteLine($"{/*result.IpAddress*/ ipAddress}:{port} - open."); } socket.Close(); return port; } catch (Exception ex) { Debug.WriteLine($" Exception happened =( - {ex.Message}"); return -1; } }); [RelayCommand] public async void NetScan2Start() => await Task.Run(async () => { try { int[] ports = { 22, 80, 443, 554, 3389, 8000, 37777 }; int timeoutMs = 2500; var stopwatch = new Stopwatch(); stopwatch.Start(); // I would change the method to return IP addresses. /*var netScanResults*/ IList<IPAddress> addresses = await NetUtility.ScanNetwork2_Prepare(NetScanIpRangeBegin, NetScanIpRangeEnd, NetScanNetmaskSelected, ports, timeoutMs); //NetScanResults = new ObservableCollection<NetScanResult>(netScanResults); //var tasks = new List<Task>(); var netScanTasks = new Task<NetScanResult>[addresses.Count]; //foreach (var netScanResult in NetScanResults) for (int i = 0; i < addresses.Count; i++) { var portsTasks = new Task<int>[ports.Length]; IPAddress tempAddress = addresses[i]; //foreach (var port in ports) for (int j = 0; j < ports.Length; j++) { //NetScanResult tempResult = netScanResult; int tempPort = ports[j]; /*var task*/ portsTasks[j] = ScanPortAsync(/*tempResult,*/ tempAddress, tempPort, timeoutMs); //tasks.Add(task); } netScanTasks[i] = CreateResult(); async Task<NetScanResult> CreateResult() { await Task.WhenAll(portsTasks); List<int> aports = new List<int>(ports.Length); foreach (var task in portsTasks) { int port = task.Result; if (port > 0) { aports.Add(port); } } return new NetScanResult(tempAddress, aports); }; } await Task.WhenAll(netScanTasks); NetScanResults = netScanTasks.Select(task => task.Result).ToArray(); stopwatch.Stop(); MessageBox.Show($"Scan finished in {stopwatch.ElapsedMilliseconds}ms"); } catch (Exception ex) { ShowInvalidData(ex.Message); return; } });
我在尝试在后台线程中进行资源清理时遇到问题。在线程中运行的代码意味着无限期地运行或直到它停止然后完成清理。我可以...
我正在尝试使用 Rayon 的 par_iter() 来优化我的函数。 单线程版本是这样的: fn verify_and_store(store: &mut Store, txs: Vec) { 让结果 = txs...
我想在异步函数中使用 threading.Lock() , asyncio.Lock() 不是线程安全的,所以我不能使用 wait asyncio.Lock(): 。我需要使用 threading.Lock() 的原因是因为这个对象可能......
在 grep 克隆中使用 std::future 与 std::thread
我最近写了一个 grep 克隆。它对指定目录的所有文件进行字符串查询的递归搜索。程序的核心是如下所示的函数。 /** 递归搜索 q...
如果所有其他引用都被删除,实例成员方法中徘徊的线程是否会使实例保持活动状态?
非常简单的是/否问题: 假设,我有一个带有实例成员方法的类。 假设该方法使线程休眠一个小时。 我分配实例成员方法由 ThreadP 运行...
是否可以在 Google Cloud Functions (Node.js) 中运行并行任务或多线程?
我有一个用 Node.js 编写的 Google Cloud Function,我想在完全独立的处理器上运行并行任务。这在 Google Cloud Functions 中可行吗? 另外,会切换...
我有一个解码函数,可以解码字符串并在内部使用映射来存储已解码的值以提高效率。该函数由多个线程访问(使用pthread),因此要防止
我有一个场景,我需要 HashMap 的最大大小为 10000。进一步插入的任何记录都应删除最旧的条目并继续插入。它适用于多线程场景。 我是
在创建shared_ptr的副本之前,原始的shared_ptr是否可能超出范围
这可能是一个愚蠢的问题,但我无法回答。 使用下面的代码片段,输出是否有可能打印“Shared Ptr out of range” 我正在尝试的是在共享之前
在 Windows 上,您可以为进程调用 SetProcessAffinityMask,为线程调用 SetThreadAffinityMask。 然而,Windows 似乎只公开了 GetProcessAffinityMask,而不是用于单独的类似 API...
如何在WinForms中异步显示启动画面,同时在后台加载主窗体(C#)?
我正在开发一个包含 WinForms 和 WPF 组件的 WinForms 应用程序。我想在后台异步加载主窗体(frmTP2D)时显示启动屏幕...
我有一个完整的“工作”Python代码,它应该包含两个同时运行的线程,它们填充字典中的一些列表,当用户按 CRTL-C 这两个
这就是http://invisible-island.net/ncurses/ncurses.faq.html#multithread上所说的 如果您的程序在多个线程中使用诅咒,您几乎肯定会看到奇怪的行为......
在我的 C++17 应用程序中,我有一个运行无限循环的线程,在每次迭代中执行一些工作(每次需要几秒钟)。 现在我想在另一个线程中等待(或在多个其他线程中等待......
WaitForSingleObject 在休眠线程上调用时立即返回
我有一个长时间休眠的线程,当需要关闭它时,我设置了一个主程序和线程都可以访问的原子变量并调用 WaitForSingleO...
如何同步 Windows 上运行的两个 Java 进程? 我正在寻找类似 Win32 命名互斥对象的东西,它允许两个进程使用相同的锁定对象。 谢谢