标签: threadpool

accept()线程安全吗?

我正在用C编写一个简单的网络服务器,用于我正在做的课程.一个要求是我们实现一个线程池来处理使用pthreads的连接.

我知道我将如何大致这样做(在主线程中调用accept并将文件描述符传递给freee线程),但是我的朋友提出了一种替代方法,而不是我想到的方法:在前面创建我的所有线程,并让他们全部循环接听电话.接受的想法是阻止所有空闲线程,当连接进入时,只给出一个文件描述符.然后当一个给定的线程完成一个连接时,它会循环回来并阻塞一个调用再次接受.使用accept()作为信号量的调用.这样可以简化其实现的实现,因为您不需要跟踪哪些线程正忙,哪些线程已准备好进行连接.理论上它也可能是较低的延迟,因为线程可以立即开始执行.

我的问题是,这样安全吗?我打算实施它并尝试一下,但我还没准备好,我很想知道答案.我在谷歌和这里搜索stackoverflow,但找不到任何人这样做.接受线程安全吗?我假设这种方法会有更多的开销,因为你一直在运行所有的线程,这两种方法只是简单的内存/延迟权衡吗?

编辑:我不确定这应该是社区维基,如果它应该是道歉,我找不到按钮:P

c sockets pthreads threadpool

12
推荐指数
1
解决办法
3469
查看次数

如何在ThreadPoolExecutor中使用AsyncTask

我对ThreadPoolExecutor有点困惑.这是我想要完成的:

我有一个列表视图,左侧是图像图标,右侧是简短说明.我已经静态定义了所有文本,但是我想从网上获取图标.我已经知道如何从网址获取图像,但是我不希望每个图标产生'n'个线程来获取图标图像.所以我读了关于asynctask的threadpoolexecutor,我不知道该怎么做.你们能让我先行一步吗?我是否必须创建一个threadpoolexecutor并在其中使用asynctasks?

我的清单就像这样..没有图标.

___________________________
[icon][a short description]
____________________________
[icon][a short description]
_____________________________
[icon][a short description]
_____________________________
[icon][a short description]
____________________________
Run Code Online (Sandbox Code Playgroud)

android threadpool android-asynctask

12
推荐指数
1
解决办法
2万
查看次数

在Win7中运行多线程Java项目的零星问题

我正在开发一个内存和计算密集型项目.执行的很大一部分利用a的多线程FixedThreadPool.简而言之; 我有一个线程用于从几个远程位置(使用URL连接)获取数据并填充BlockingQueue要分析的对象和n个挑选这些对象并运行分析的线程.编辑:见下面的代码

现在,这种设置就像运行的OpenSUSE 11.3我的Linux机器上的魅力,但一个同事正在测试其运行Win7的是得到一个非常类似的机器上的自定义通知队列轮询超时(见下面的代码),他们很多实际.我一直在尝试监控她的机器上的处理器使用情况,看起来该软件在我的机器上没有超过15%的CPU,处理器的使用量达到了我的预期.

那么,我的问题是,这可能是队列"饥饿"的标志吗?可能是因为生产者线程没有获得足够的CPU时间?如果是这样,我如何才能更优先考虑池中的一个特定线程?

更新: 我一直试图找出问题,没有任何快乐......但我确实获得了一些新的见解.

  • 使用JVisualVM分析代码的执行表明了一种非常奇特的行为.这些方法在短时间的CPU时间内被调用,两次之间没有任何进展.这对我来说意味着操作系统在某种程度上对这个过程起了制动作用.

  • 禁用防病毒和备份守护进程对此问题没有任何重大影响

  • 通过任务管理器(这里建议)更改java.exe(唯一实例)的优先级也不会改变任何内容.(话虽这么说,我不能给java"实时"优先级,并且必须满足于"高"prio)

  • 分析网络使用情况显示出良好的数据流入和流出,因此我猜这不是瓶颈(虽然它是流程执行时间的相当一部分,但我已经知道并且几乎与我在Linux机器上得到的东西).

关于Win7操作系统如何限制我的项目的CPU时间的任何想法?如果它不是操作系统,可能是什么限制因素?我想再次强调,机器不会同时运行任何其他计算密集,除了我的软件之外,cpu几乎没有任何负载.这真让我抓狂...

编辑:相关代码

public ConcurrencyService(Dataset d, QueryService qserv, Set<MyObject> s){

    timeout = 3;
    this.qs = qserv;
    this.bq = qs.getQueue();
    this.ds = d;
    this.analyzedObjects = s;
    this.drc = DebugRoutineContainer.getInstance();
    this.started = false;

    int nbrOfProcs = Runtime.getRuntime().availableProcessors();
    poolSize = nbrOfProcs;
    pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(poolSize);
    drc.setScoreLogStream(new PrintStream(qs.getScoreLogFile()));
}

public void serve() throws InterruptedException {
    try {
        this.ds.initDataset();
        this.started = true; …
Run Code Online (Sandbox Code Playgroud)

java multithreading threadpool thread-priority

12
推荐指数
1
解决办法
1055
查看次数

如何强制立即终止ThreadPoolExecutor中的所有worker

我在里面有很多任务TheadPoolExecutor.我的界面上有一个停止按钮,可以ThreadPoolExecutor立即终止所有线程.我正在寻找一种方法来做到这一点.(没有shutDown()shutDownNow()).

谢谢

java multithreading threadpool threadpoolexecutor

12
推荐指数
3
解决办法
2万
查看次数

Java从ExecutorService设置回调

我有一个fixedThreadPool,我用它来运行一堆工作线程来实现具有许多组件的任务的并行执行.

当所有线程都完成后,我使用方法(getResult)检索它们的结果(它们非常大)并将它们写入文件.

最终,为了节省内存并能够看到中间结果,我希望每个线程在完成执行后立即将其结果写入文件,然后释放其内存.

通常,我会在run()方法的末尾添加代码.但是,此类中的某些其他对象也会调用这些线程,但不要让它们将结果写入文件 - 而是使用其结果执行其他计算,最终将其写入文件.

所以,我想知道是否可以使用ExecutorService将回调函数附加到线程完成事件.这样,我可以立即检索其结果并释放该场景中的内存,但在其他场景中使用这些线程时不会破坏代码.

这样的事情可能吗?

java multithreading callback executorservice threadpool

12
推荐指数
4
解决办法
1万
查看次数

如何在不阻止UI的情况下等待线程完成

我希望我的程序在下面的行之后等待

frmProgressBarObj = PullMSI.ExtractByMSIName("products.txt", false);
Run Code Online (Sandbox Code Playgroud)

如上所述方法是通过StartProcessWithProgress()方法在内部调用线程.我希望在执行代码逻辑-2行之前完成该线程.同时,它不应该停止由frmProgressBar.UpdateProgress()完成的UI更新.我该怎么做呢?

namespace NS1
{
    public partial class frmMain : Form
    {                
        private void button1_Click(object sender, EventArgs e)
        {
            frmProgressBar frmProgressBarObj = PullMSI.ExtractByMSIName("products.txt", false);
            //code logic - 2
            MessageBox.Show("This is executing immediately. 
                             I want to wait until above thread is complete");
        }
    }

    public partial class frmProgressBar : Form
    {

        public void UpdateProgress(String strTextToDisplayOnProgress)
        {
            progressBar1.BeginInvoke(
                   new Action(() => 
                   { 
                       progressBar1.Value++; 
                       lblFileName.Text = strTextToDisplayOnProgress;
                       if (progressBar1.Value == progressBar1.Maximum)
                       {
                           this.Hide(); 
                        } 
                    }));
        }

        public delegate void …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading task threadpool

12
推荐指数
1
解决办法
3万
查看次数

在线程池中复用C#5.0的异步 - 线程安全吗?

这可能看起来有点疯狂,但这是我正在考虑作为更大的库的一部分的方法,如果我可以合理地确定它不会导致奇怪的行为.

该方法:

使用SynchronizationContext调度到线程池的异步用户代码运行.用户代码看起来像:

async void DoSomething()
{
    int someState = 2;
    await DoSomethingAsync();
    someState = 4;
    await DoSomethingElseAsync();
    // someState guaranteed to be 4?
}
Run Code Online (Sandbox Code Playgroud)

我不确定访问someState是否是线程安全的.虽然代码将在一个"线程"中运行,使得操作实际上是完全有序的,但它仍然可以分布在引擎盖下的多个线程中.如果我的理解是正确的,那么在x86上排序应该是安全的,并且因为变量不是共享的,所以我不需要担心编译器优化等等.

更重要的是,我担心这是否会在ECMA或CLR内存模型下保证线程安全.

我很确定在执行排队的工作之前我需要插入一个内存屏障,但我对这里的推理并不完全有信心(或者这种方法可能由于完全不同的原因而不可行).

c# thread-safety threadpool async-await

11
推荐指数
1
解决办法
597
查看次数

Java - 线程和CPU之间的关系

我是多线程的新手,我正在开发一个项目,我试图在我的Java程序中使用4个CPU.我想做点什么

int numProcessors = Runtime.getRuntime().availableProcessors();
ExecutorService e = Executors.newFixedThreadPool(numProcessors);
Run Code Online (Sandbox Code Playgroud)

这可以保证每个CPU都有一个线程工作吗?在我创建线程时,系统不会很忙,但是一段时间后它会非常繁忙.我认为操作系统会选择最不繁忙的CPU来创建线程,但是如果它们在创建时没有特别繁忙的话它是如何工作的呢?

此外,线程池服务应该重用线程,但如果它看到另一个CPU上有更多的可用性,它会杀死线程并在那里产生一个新线程吗?

java multithreading executorservice threadpool

11
推荐指数
1
解决办法
953
查看次数

有效地等待线程池中的所有任务完成

我目前在我的线程池中有一个带有x worker 的程序.在主循环Ÿ任务分配给工人来完成,但之后的任务被发送出去,我必须与节目之前之前等待所有任务完成.我相信我目前的解决方案效率低下,必须有更好的方法等待所有任务完成,但我不知道如何去解决这个问题

// called in main after all tasks are enqueued to 
// std::deque<std::function<void()>> tasks
void ThreadPool::waitFinished()
{
    while(!tasks.empty()) //check if there are any tasks in queue waiting to be picked up
    {
        //do literally nothing
    }
}
Run Code Online (Sandbox Code Playgroud)

更多信息:

线程池结构

//worker thread objects
class Worker {
    public:
        Worker(ThreadPool& s): pool(s) {}
        void operator()();
    private:
        ThreadPool &pool;
};

//thread pool
class ThreadPool {
    public:
        ThreadPool(size_t);
        template<class F>
        void enqueue(F f);   
        void waitFinished();
        ~ThreadPool();
    private:
        friend class Worker; …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading wait threadpool stdthread

11
推荐指数
1
解决办法
5875
查看次数

在高性能套接字上使用Async-Await vs ThreadPool与MultiThreading(C10k解决方案?)

我对async-awaits,pools和threads 感到困惑.主要问题始于这个问题:"当我必须处理10k套接字I/O时,我该怎么办?" (又名C10k问题).

  • 首先,我尝试使用一个主要Queue和多个Threads来处理所有传入数据的线程来创建自定义池化架构.这是关于理解一个伟大的经验 thread-safetymulti-threading但是thread是一个矫枉过正async-await时下.
  • 后来,我实现了一个简单的架构,async-await但我无法理解为什么"async和await关键字不会导致创建额外的线程." (来自MSDN)?我认为必须要做一些threadBackgroundWorker这样的工作.
  • 最后,我实现了另一个架构,ThreadPool它看起来像我的第一个自定义池.

现在,我认为我应该有其他人对处理C10k感到困惑.我的项目是我的游戏项目的专用(中央)服务器,它是集线器/大厅服务器,如MCSG的大厅或COD的配对服务器.我将进行登录操作,游戏服务器命令执行/查询和服务信息(如版本,补丁).

最后一部分可能对我的项目更具体,但我真的需要一些关于多个(重)数据处理的真实世界解决方案的好建议.

(也就是说,1k-10k-100k连接处理取决于服务器硬件,但这是一般性问题)


关键点:在任务并行库和ThreadPool之间选择(MSDN博客)


[附加]想要了解我们在谈论什么的好(基本)事物:

  1. 主题
  2. 异步,等待
  3. 线程池
  4. 的BackgroundWorker

c# sockets multithreading asynchronous threadpool

11
推荐指数
1
解决办法
8557
查看次数