当我们使用这三种时,有哪些不同的情况?我应该在哪里使用,哪个不应该?
如何在postgres中查询授予对象的所有GRANTS?
例如,我有表"mytable":
GRANT SELECT, INSERT ON mytable TO user1
GRANT UPDATE ON mytable TO user2
Run Code Online (Sandbox Code Playgroud)
我需要一些能给我的东西:
user1: SELECT, INSERT
user2: UPDATE
Run Code Online (Sandbox Code Playgroud) 编辑:为了参考目的(如果有人偶然发现这个问题),伊戈尔奥斯特罗夫斯基写了一篇关于缓存未命中的精彩帖子.它讨论了几个不同的问题并显示了示例数字. 结束编辑
我做了一些测试<long story goes here>,我想知道性能差异是否是由于内存缓存未命中.以下代码演示了该问题,并将其归结为关键时序部分.以下代码有几个循环,以随机顺序访问内存,然后按升序地址顺序访问内存.
我在XP机器(使用VS2005:cl/O2编译)和Linux机器(gcc -Os)上运行它.两者产生了相似的时间 这些时间以毫秒为单位.我相信所有循环都在运行并且未被优化(否则它将"立即"运行).
*** Testing 20000 nodes Total Ordered Time: 888.822899 Total Random Time: 2155.846268
这些数字有意义吗?差异主要是由于L1缓存未命中还是还有其他事情发生?存在20,000 ^ 2个存储器访问,并且如果每个都是高速缓存未命中,则每个未命中约3.2纳秒.我测试的XP(P4)机器是3.2GHz,我怀疑(但不知道)有一个32KB的L1缓存和512KB的L2.有20,000个条目(80KB),我假设没有大量的L2未命中.所以这就是(3.2*10^9 cycles/second) * 3.2*10^-9 seconds/miss) = 10.1 cycles/miss.这对我来说似乎很高兴.也许不是,或者我的数学很糟糕.我尝试用VTune测量缓存未命中,但我得到了BSOD.现在我无法连接到许可证服务器(grrrr).
typedef struct stItem
{
long lData;
//char acPad[20];
} LIST_NODE;
#if defined( WIN32 )
void StartTimer( LONGLONG *pt1 )
{
QueryPerformanceCounter( (LARGE_INTEGER*)pt1 );
}
void StopTimer( LONGLONG t1, double *pdMS )
{
LONGLONG t2, llFreq;
QueryPerformanceCounter( (LARGE_INTEGER*)&t2 );
QueryPerformanceFrequency( (LARGE_INTEGER*)&llFreq );
*pdMS …Run Code Online (Sandbox Code Playgroud) 目前我按模式拆分字符串,如下所示:
outcome_array=the_text.split(pattern_to_split_by)
Run Code Online (Sandbox Code Playgroud)
问题是我分裂的模式本身总是被省略.
如何让它包含拆分模式本身?
我一直在追逐在Delphi 2007 for Win32中构建的DLL中的内存泄漏.如果在卸载DLL时线程仍然存在,则不会释放threadvar变量的内存(在卸载DLL时没有对DLL进行活动调用).
问题:有没有办法让Delphi释放与threadvar变量相关的内存?它并不像不使用它们那么简单.许多现有的Delphi组件都使用它们,所以即使DLL没有明确声明它们,它最终也会使用它们.
一些细节
我已经将它跟踪到一个LocalAlloc调用,该调用是为了响应threadvar变量的使用而发生的,这是Delphi在Win32中围绕线程本地存储的"包装器".好奇的是,分配调用是在Delphi源文件sysinit.pas中.相应的LocalFree调用仅针对获取DLL_THREAD_DETACH调用的线程发生.如果应用程序中有多个线程并卸载DLL,则不会DLL_THREAD_DETACH调用每个线程.DLL得到了一个DLL_PROCESS_DETACH没有别的东西; 我相信这是预期和有效的.因此,在其他线程上进行的任何线程本地存储分配都会泄露.
我用一个简短的C程序重新创建它,启动几个"工作"线程.它在主线程上加载DLL(通过LoadLibrary),然后调用工作线程上的导出函数.从Delphi DLL导出的函数为threadvar整数变量赋值并返回.然后C程序卸载DLL(通过主线程上的FreeLibrary)并重复.在大约32,000次迭代之后,Process Explorer中显示的进程内存使用量增长到130MB以上.我也用umdh更准确地验证了它.UMDH显示每个实例丢失24个字节.但Process Explorer中的130MB似乎表明每次迭代大约4K; 我猜测基于此每次都会泄露4K片段,但我不确定.
为了澄清,这里是threadvar声明和整个导出函数:
threadvar
threadint : integer;
function Startup( ulID: LongWord; hValue: Longint ): LongWord; stdcall;
begin
threadint := 123;
Result := 0;
end;
Run Code Online (Sandbox Code Playgroud)
谢谢.
当使用内核对象来同步在不同CPU上运行的线程时,使用Windows Server 2008 R2相对于其他操作系统可能会有一些额外的运行时成本吗?
编辑:通过答案发现,问题还应该包括"在较低的CPU利用率水平下运行"这一短语.我在自己对这个问题的回答中包含了更多信息.
我研究的产品使用共享内存和信号量进行进程间的通信(当两个进程在同一台机器上运行时).有关Windows Server 2008 R2(我在此之后缩短为Win2008R2)的性能问题的报告使我发现在Win2008R2上的两个线程之间共享信号量与其他操作系统相比相对较慢.
我能够通过在两个线程上同时运行以下代码来重现它:
for ( i = 0; i < N; i++ )
{
WaitForSingleObject( globalSem, INFINITE );
ReleaseSemaphore( globalSem, 1, NULL );
}
Run Code Online (Sandbox Code Playgroud)
使用可以双启动到Windows Server 2003 R2 SP2和Windows Server 2008 R2的计算机进行测试,上面的代码片段在Win2003R2机器上运行速度比Win2008R2快7倍(Win2003R2为3秒,Win2008R2为21秒).
以下是上述测试的完整版本:
#include <windows.h>
#include <stdio.h>
#include <time.h>
HANDLE gSema4;
int gIterations = 1000000;
DWORD WINAPI testthread( LPVOID tn )
{
int count = gIterations;
while ( count-- )
{
WaitForSingleObject( gSema4, INFINITE );
ReleaseSemaphore( gSema4, …Run Code Online (Sandbox Code Playgroud) c performance multithreading synchronization windows-server-2008
昨天关于双重检查锁定的一个问题引发了一连串的想法,让我不确定一个简单的情况.在下面的代码中,是否可以达到printf"不再同步"?在这个简单的例子中,值可能在同一个缓存行上,所以我认为它不太可能(假设开始时可能性> 0%).
如果答案是"不,这是不可能的.",那么我的后续问题是,相当可预见的:为什么不呢?直到昨天我的想法纠结并缠绕在多线程轴上,我认为代码是安全的.但现在我想知道是什么阻止从缓存中读取其中一个变量pa或的变量pb.如果pa, pb指向简单的全局整数变量而不是malloc内存,那会有关系吗?WaitForSingleObject调用是否提供内存屏障?或者指针是否应声明为volatile?这么多问题,句子很少.
更新:我最终找到的信息明确指出,信号同步对象的函数确实使用了内存屏障.应该是显而易见的,但我找不到明确的答案.所以我可以再次欺骗自己相信我理解这一切.
int i1 = 0;
int i2 = 0;
int reads = 0;
int done = 0;
int *pa = NULL;
int *pb = NULL;
HANDLE hSync = NULL;
DWORD WriteThread( LPVOID pvParam )
{
while( !done )
{
WaitForSingleObject( hSync, INFINITE );
(*pa)++;
(*pb)++;
ReleaseSemaphore( hSync, 1, NULL );
}
return 0;
}
DWORD ReadThread( LPVOID pvParam )
{
while( !done )
{
WaitForSingleObject( …Run Code Online (Sandbox Code Playgroud) 我的任务非常痛苦,我想知道是否有人可以提供帮助.
我们的供应商提供了一个SNMP mib文件(txt).不幸的是,这个文件很多都已经过时,需要为我们的监控应用程序删除.
我一直在尝试手工完成这项工作,但它已超过800,000行,并且它正在削弱我的生存意愿.
结构类似于:
-- /*********************************************************************************/
-- /* MIB table for Hardware */
-- /* Valid from: 543.44 */
-- /* Deprecated from: 600.3 */
-- /*********************************************************************************/
Some text
some text
Some text
-- /*********************************************************************************/
-- /* MIB table for Hardware */
-- /* Valid from: 543.44 */
-- /*********************************************************************************/
Some text
some text
Some text
-- /*********************************************************************************/
-- /* MIB table for Hardware */
-- /* Valid from: 364.44 */
-- /* Deprecated from: 594.3 */
-- /*********************************************************************************/ …Run Code Online (Sandbox Code Playgroud) 当我使用Visual Studio 2010调试故障转储文件(本机代码)时,它会尝试从原始构建文件夹加载C/C++源文件(并提供消息"The source file is different from when the module was built. Would you like the debugger to use it anyway?").消息是正确的; 该文件不是正确的版本.
我想VS2010要做的是使用源服务器检出源文件.如果该文件当前不存在于其原始构建位置,则VS2010将正确使用源服务器并检索该文件的相应修订版本(来自Subversion).为了强制它检查正确的版本,我必须从原始构建位置物理删除该文件.
作为旁注,VS2005可以按照需要工作(好吧......正如我所希望的那样,也许不像其他人想要的那样).无论原始构建文件夹中是否存在该文件的副本,VS2005将始终从源代码管理中检出正确的修订版.
我相信问题归结为以下之一: