小编Mah*_*dsi的帖子

减慢线程的最佳方法?使用睡眠()好吗?

我编写了一个C++库来完成一些非常繁重的CPU工作(所有这些都是数学和计算),如果留给它自己的设备,将很容易消耗100%的所有可用CPU资源(它也是多线程的可用逻辑数量)机器上的核心).

因此,我在主计算循环中有一个回调,使用该库的软件应该调用:

while(true)
{
    //do math here
    callback(percent_complete);
}
Run Code Online (Sandbox Code Playgroud)

在回调中,客户端调用Sleep(x)来减慢线程.

最初,客户端代码是一个固定的Sleep(100)调用,但这会导致糟糕的不可靠性能,因为有些机器比其他机器更快地完成数学运算,但所有机器上的睡眠都是相同的.所以现在客户端检查系统时间,如果超过1秒(= =几次迭代),它将休眠半秒钟.

这是减慢线程的可接受方式吗?我应该使用信号量/互斥量而不是Sleep()来最大化性能吗?每1秒处理工作正在睡觉x毫秒,还是有什么不对的,我没有注意到?

我问的原因是,即使taskman显示该进程占用了大约10%的CPU,机器仍然会严重陷入困境.我已经探讨过硬盘和内存争用无济于事,所以现在我想知道我放慢线程的方式是否导致了这个问题.

谢谢!

c++ performance multithreading sleep cpu-usage

8
推荐指数
2
解决办法
4079
查看次数

如何在滚动时进行图像淡入效果(如mashable.com)

我想知道mashable.com上图像的淡入效果(例如http://mashable.com/2009/08/14/google-android-logo-remixes/)

当您滚动到图像时,它会淡入.它不会在页面加载时消失,只会在屏幕上项目的实际外观上消失.

谢谢.

javascript animation fade effect

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

Linux中的CreateRemoteThread

我在Windows中使用CreateRemoteThread,想知道Linux中是否可以使用相同的东西.是否可以在Linux中执行此操作?

linux ptrace posix pthreads

8
推荐指数
2
解决办法
3260
查看次数

在visual c ++中使用^运算符

我正在做Visual C++编程,我已经创建了一个CLR控制台应用程序.我注意到String数组应该声明为String ^,而不是String [].有什么用?^ 为什么要用它代替[]?这种替代仅限于CLR应用吗?这是一行代码和错误:

array<String[]>[] abc;
Run Code Online (Sandbox Code Playgroud)

产生的错误是

错误C2143:语法错误:缺少';' 在'['之前

错误C2146:语法错误:缺少';' 在标识符'abc'之前

eror C2065:'abc':未声明的标识符

arrays c++-cli visual-c++

7
推荐指数
1
解决办法
4446
查看次数

在C#中动态"解压缩"IEnumerable或最佳替代方案

让我们假设您有一个函数返回一个延迟枚举的对象:

struct AnimalCount
{
    int Chickens;
    int Goats;
}

IEnumerable<AnimalCount> FarmsInEachPen()
{
    ....
    yield new AnimalCount(x, y);
    ....
}
Run Code Online (Sandbox Code Playgroud)

您还有两个消耗两个独立IEnumerables的函数,例如:

ConsumeChicken(IEnumerable<int>);
ConsumeGoat(IEnumerable<int>);
Run Code Online (Sandbox Code Playgroud)

如何调用ConsumeChickenConsumeGoatFarmsInEachPen()预先转换ToList()因为它可能有两个zillion记录,b)没有多线程.

基本上:

ConsumeChicken(FarmsInEachPen().Select(x => x.Chickens));
ConsumeGoats(FarmsInEachPen().Select(x => x.Goats));
Run Code Online (Sandbox Code Playgroud)

但是没有强制双重枚举.

我可以使用多线程来解决它,但是每个列表的缓冲队列都会变得不必要地复杂化.

所以我正在寻找一种方法将AnimalCount枚举器分成两个int枚举器而不进行全面评估AnimalCount.在锁定步骤中一起运行ConsumeGoat并没有问题ConsumeChicken.

我可以感觉到解决方案,但我并不完全在那里.我正在考虑一个辅助函数,它返回一个IEnumerable被输入的函数,ConsumeChicken每次使用迭代器时,它在内部调用ConsumeGoat,从而在锁步中执行这两个函数.当然,除了我不想ConsumeGoat多次打电话..

c# linq algorithm ienumerable enumerator

7
推荐指数
1
解决办法
774
查看次数

git选择性还原(等同于git revert --patch)

是否有一种首选的方法,可以部分还原未暂存的更改(git checkout -p)和部分添加未暂存的更改(git add -p)来还原先前提交的一部分?

也就是说,我有一个提交(包含多个所需更改和不想要的更改)的多个(或什至很多个)提交,我想选择性地还原其中一些更改,同时保留其他更改。

我当前的工作流程不好玩:

git diff commit commit^ > selective.diff
cp selective.diff selective2.diff
nvim selective2.diff 
# change unwanted - to ' ' and remove unwanted +, then save
rediff selective.diff selective2.diff | rewrite selective2.diff
git apply selective2.diff
Run Code Online (Sandbox Code Playgroud)

并祈祷补丁需要

git git-revert

7
推荐指数
2
解决办法
1025
查看次数

随机完整系统无响应运行数学函数

我有一个程序,一次加载一个文件(从10MB到5GB)一个块(ReadFile),并为每个块执行一组数学运算(基本上计算哈希).

在计算散列之后,它将关于块的信息存储在STL映射中(基本上<chunkID, hash>),然后将块本身写入另一个文件(WriteFile).

就是这样.该程序将导致某些PC窒息死亡.鼠标开始断断续续,任务管理器需要> 2分钟显示,ctrl + alt + del无响应,运行程序很慢......工作.

我已经完成了我能想到的优化程序的所有内容,并对所有对象进行了三重检查.

我做了什么:

  • 尝试了不同的(不太密集的)散列算法.
  • 将所有分配切换到nedmalloc而不是默认的new运算符
  • 从stl :: map切换到unordered_set,发现性能仍然很糟糕,所以我再次切换到Google的dense_hash_map.
  • 转换所有对象以存储指向对象的指针而不是对象本身.
  • 缓存所有读写操作.我没有读取16k的文件块并对其进行数学运算,而是将4MB读入缓冲区并从那里读取16k块.所有写操作都相同 - 它们在写入磁盘之前合并为4MB块.
  • 使用Visual Studio 2010,AMD Code Analyst和perfmon进行大量分析.
  • 将线程优先级设置为THREAD_MODE_BACKGROUND_BEGIN
  • 将线程优先级设置为THREAD_PRIORITY_IDLE
  • 每次循环后添加Sleep(100)调用.

即使在所有这些之后,应用程序仍然会在某些情况下导致系统范围内的某些机器挂起.

Perfmon和Process Explorer显示最小的CPU使用率(使用休眠),没有来自磁盘的持续读/写,几个硬页面故障(在5GB输入文件的应用程序的生命周期中只有~30k页面故障),虚拟内存很少(从不超过150MB),没有泄漏的手柄,没有内存泄漏.

我在运行Windows XP时测试过的机器 - 包括Windows 7,x86和x64版本.没有少于2GB的RAM,尽管在较低的内存条件下问题总是会加剧.

我不知道下一步该做什么.我不知道是什么导致它 - 我在CPU或内存之间被撕裂是罪魁祸首.CPU因为没有睡眠和不同的线程优先级,系统性能会发生显着变化.内存,因为使用unordered_set与Google的dense_hash_map时,问题发生的频率存在巨大差异.

有什么奇怪的?显然,NT内核的设计应该防止这种行为的不断发生(用户模式应用驱动系统,这种极端的表现不佳!?)......但是当我编译和运行代码在OS X或Linux上(它是相当标准的C++),即使在内存较少且CPU较弱的糟糕机器上也能表现出色.

接下来我应该做什么?我怎么知道Windows在杀死系统性能的幕后所做的是什么,当所有指标都是应用程序本身没有做任何极端的事情时?

任何建议都是最受欢迎的.

c++ windows optimization performance kernel

6
推荐指数
1
解决办法
303
查看次数

在没有子查询的MySQL中优先使用ORDER BY而不是GROUP BY

我有以下查询,它做了我想要的,但我怀疑没有子查询可以这样做:

  SELECT * 
    FROM (SELECT * 
            FROM 'versions' 
        ORDER BY 'ID' DESC) AS X 
GROUP BY 'program'
Run Code Online (Sandbox Code Playgroud)

我需要的是按程序分组,但返回具有最高值"ID"的版本中的对象的结果.

在我过去的经验中,像这样的查询应该在MySQL中工作,但由于某种原因,它不是:

  SELECT * 
    FROM 'versions' 
GROUP BY 'program' 
ORDER BY MAX('ID') DESC
Run Code Online (Sandbox Code Playgroud)

想要做的是让MySQL首先执行ORDER BY 然后再执行GROUP BY,但它坚持首先执行GR​​OUP BY,然后执行ORDER BY.即它正在对分组的结果进行排序,而不是对排序的结果进行分组.

当然不可能写

SELECT * FROM 'versions' ORDER BY 'ID' DESC GROUP BY 'program'

谢谢.

mysql sql group-by subquery sql-order-by

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

新的.NET 2.0 C++/CLI项目是否隐含依赖于mscorlib v4?

我在Visual Studio 2012中创建了一个新的C++/CLI项目,并在项目创建页面上选择了.NET 2.0作为框架.我已验证"外部依赖项"(mscorlib.dll,System.Data.dll,System.dll和System.XML.dll)显示"路径" c:\Windows\Microsoft.NET\Framework\v2.0.50727\*.

在同一解决方案中从C#.NET 2.0项目添加对此项目的引用时,在构建时,编译器无法链接到我的C++库,并出现以下错误:

警告2无法解析主要参考"D:\ GIT\EasyBCD\Release\Win32Interop.dll",因为它对.NET Framework程序集具有间接依赖性"mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089"其当前目标框架中的版本"4.0.0.0"高于版本"2.0.0.0".C:\ Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.Targets 1578

但是,就像我说的那样,'Win32Interop'项目中的引用清楚地表明使用了v2.0,并且项目文件本身包含<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>它应该包含的内容.

为什么Visual Studio 2012给了我这么难的时间?

编辑

神秘感加深了.尝试删除所有,然后在C++/CLI项目中重新添加.NET引用时,显示如下:

添加新依赖项

如您所见,顶部显示"Targeting:.NET Framework 2.0"和"Version"列表示我选择版本"2.0.0.0".

但是,单击"确定"后,这就是引用列表的样子:

.NET依赖列表

Targeted框架仍为".NETFramework,Version = v2.0",但各个引用均表示正在使用版本"4.0.0.0"(以及该版本文件的公钥标记).

然而,选择每个引用时的属性对话框绝对保持正在使用v2.0文件.谁相信?该怎么办?

.net interop c++-cli .net-framework-version visual-studio-2012

6
推荐指数
1
解决办法
3443
查看次数

向量:rend()被erase()无效

根据C++规范(23.2.4.3),vector :: erase()只会使"擦除点之后的所有迭代器和引用"无效"

这样,在采用reverse_iterators时越过所有向量成员,在当前迭代器的擦除应该引起撕裂()成员将被无效.

此代码将在G ++下运行,但会在Windows上提供运行时异常(VS2010):

#include <vector>

using namespace std;

int main()
{
    vector<int> x;
    x.push_back(1);
    x.push_back(2);
    x.push_back(3);

    //Print
    for(vector<int>::const_iterator i = x.begin(); i != x.end(); ++i)
        printf("%d\n", *i);

    //Delete second node
    for(vector<int>::reverse_iterator r = x.rbegin(); r != x.rend(); ++r)
        if(*r == 2)
            x.erase((r+1).base());

    //Print
    for(vector<int>::const_iterator i = x.begin(); i != x.end(); ++i)
        printf("%d\n", *i);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误很有趣:

表达式:向量迭代器不可递减

在第二次运行时给出第二个for循环的行.递减引用reverse_iterator的内部"当前"迭代器成员,每当reverse_iterator递增时递减.

有人能解释一下这种行为吗?

谢谢.

编辑

我认为这个代码示例更好地表明它不是r的问题,而是rend():

//Delete second node
for(vector<int>::reverse_iterator r = x.rbegin(); r != x.rend();)
{
    vector<int>::reverse_iterator …
Run Code Online (Sandbox Code Playgroud)

c++ vector erase visual-c++

5
推荐指数
1
解决办法
1050
查看次数