【问题标题】:Is this a good method for counting threads in C++?这是在 C++ 中计算线程数的好方法吗?
【发布时间】:2021-12-24 11:02:05
【问题描述】:

我一直在寻找一种可靠的方法来计算要使用的程序可访问的线程数。我不想使用常量,并假设每个系统都有相同数量的可访问线程。我设计了这种试图弄清楚的方法。是好方法吗?

#include "pch.h"
#include <iostream>
#include <thread>

using namespace std;

struct list
{
    void *data;
    list *next;

    list(list *x = nullptr)
    {
        data = x;
        next = nullptr;
    }
    void add()
    {
        next = new list;
    }
};

void sleepo(int xz)
{
    for (int x = 0; x < 10000000; x++)
    {
        xz++;
    }
}

int main()
{
    int count = 1;
    list *iterator = new list;

    cout << "Attmepting to count threads..." << endl;

    while (true)
    {
        try
        {
            iterator->data = new thread(sleepo, count);
            iterator->add();
            iterator = iterator->next;
            count++;
        }
        catch(system_error)
        {
            break;
        }
    }

    cout << "There are " << count << " threads." << endl;
}

【问题讨论】:

  • 这个数字通常不是一个常数;它可能取决于任何给定时刻系统上可用的确切资源量(主要是内存)。仅仅因为您今天能够在一项测试中启动 5000 个线程,并不能保证您明天也能成功地做同样的事情。所以任何程序仍然必须能够处理创建线程失败的可能性。
  • 另请注意,在所有线程加入或分离之前退出程序是错误的。
  • 计算可以创建的线程数通常有用。对于 CPU 密集型工作,在 Linux 上使用sched_getaffinity,并计算位数。对于基于线程的 I/O(ick!),只需创建所需数量即可;你很有可能会先达到其他限制。

标签: c++ multithreading system hardware


【解决方案1】:

不,没有标准的方法来计算程序已启动的线程数。既不在 C++ 标准中,也不在 POSIX 标准中。

我设计了这种方法来尝试解决这个问题。是好方法吗?

如果您可以控制每个线程的创建,那么就可以了。但是如果你使用一个也创建线程的库,除非你能以某种方式注入代码来增加你的计数器,否则它将不起作用。

为了知道当前线程数而不是启动线程的总数,您需要在每次加入时递减计数器。

【讨论】:

  • “没有标准方法”——这是真的吗?我原以为可以使用thread_local 变量,它具有一个构造函数操作,该操作添加到具有static 存储持续时间的全局对象。有效地创建仅在线程入口处执行的静态计数器。
  • @Human-Compiler 它不能通用,因为您必须在每个线程中使用线程局部变量才能构造它。因此,就像在 OP 的代码中一样,您必须控制线程。尽管您不需要控制线程的创建,而是控制线程的作用,但它略有不同。
猜你喜欢
  • 1970-01-01
  • 2017-03-02
  • 2017-01-12
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多