小编Y.Z*_*Y.Z的帖子

Windows条件变量与事件

我们可以使用新的条件变量原语或windows事件来同步WinNT v6.x或更高版本中的线程.考虑以下两种方法,我们希望工作者在main中设置"go"的同时运行,否则它们都应该阻塞.

/*language C code*/
/*Windows Condition Variable*/
int go=0;
CONDITION_VARIABLE cv;
SRWLOCK lock;
void workers()
{
    AcquireSRWLockShared(&lock);
    if(go==0)
    {
        SleepConditionVariableSRW(&cv, &lock, INFINITE, CONDITION_VARIABLE_LOCKMODE_SHARED);
    }
    ReleaseSRWLockShared(&lock);
    /*
    Workers continue...
    */
}
void main()
{
    int i;
    InitializeConditionVariable(&cv);
    InitializeSRWLock(&lock);
    for(i=0;i<10;i++)
    {
        CreateThread(0, 0, workers, 0, 0, 0);
    }
    AcquireSRWLockExclusive(&lock);
    go=1;
    ReleaseSRWLockExclusive(&lock);
    WakeAllConditionVariable(&cv);
}
Run Code Online (Sandbox Code Playgroud)

要么

/*language C code*/
/*Windows Event*/
HANDLE go;
void workers()
{
    WaitForSingleObject(go, INFINITE);
    /*
    Workers continue...
    */
}
void main()
{
    int i;
    go=CreateEvent(0,1,0,0); /*No security descriptor, Manual …
Run Code Online (Sandbox Code Playgroud)

c windows multithreading condition-variable readerwriterlockslim

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

为什么I/O完成端口中的CompletionKey?

来自MSDN的关于CreateIoCompletionPort函数中的CompletionKey的评论:

使用CompletionKey参数可帮助您的应用程序跟踪已完成的I/O操作.CreateIoCompletionPort不使用此值进行功能控制; 相反,它在与I/O完成端口关联时附加到FileHandle参数中指定的文件句柄.对于每个文件句柄,此完成键应该是唯一的,并且它在整个内部完成排队过程中伴随文件句柄.当完成数据包到达时,它将在GetQueuedCompletionStatus函数调用中返回.PostQueuedCompletionStatus函数还使用CompletionKey参数来排队您自己的专用完成数据包.

上述言论给我一个问题.为什么使用CompletionKey,因为我们可以将用户上下文与扩展重叠结构中的文件句柄相关联,如下所示:

typedef struct s_overlappedplus
{
    OVERLAPPED ol;
    int op_code;
    /*we can alternatively put user context over here instead of CompletionKey*/
    LPVOID user_context;
} t_overlappedplus;
Run Code Online (Sandbox Code Playgroud)

完成后通过CONTAINING_RECORD宏进行检索?

很酷,我只相信CompletionKey是每个句柄的上下文,而扩展的重叠结构是每I/O一个.但是这种设计背后的哲学是什么,在什么情况下可以使用CompletionKey而不是在用户上下文中使用扩展的重叠结构?

windows multithreading winsock overlapped-io io-completion-ports

5
推荐指数
0
解决办法
837
查看次数

将Ubuntu 12.04上的GCC 4.6.3升级到4.8.2

我即将更新Ubuntu 12.04发布的默认GCC(版本4.6.3)到4.8.2,尽管编译需要一个独立的C++编译器

admin@ubuntu: /usr/local/gcc_build$ sudo make
Run Code Online (Sandbox Code Playgroud)

结束了

configure: error: C++ compiler missing or inoperational
make[2]: *** [configure-stage1-libcpp] Error 1
Run Code Online (Sandbox Code Playgroud)

因此我转向g++安装过程,优先选择最新版本,这意味着我想直接从源代码编译而不是apt-get.但说真的,我无论如何都找不到来源!(O_o).另一方面,GCC的来源是否也出现g++在我下载的tar文件中?谢谢.

PS:问题仍然没有解决 admin@ubuntu: /usr/local/gcc_build$ /home/admin/gcc-4.8.2/configure --enable-languages=c,c++

gcc g++ ubuntu-12.04

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

在类中映射<string,string>

当我尝试在VS2010中编译以下代码时,提示错误C2678.

#include <string>
#include <map>
using namespace std;
class test
{
    private:
        map<string, string> data;
    public:
        test(){};
        ~test(){};
    public:
        const string & get(const string & key)const{return data[key];}; //error C2678
        bool set(const string & key, const string & value){data[key]=value;return true;};
};
void main()
{
    const string key="Hello world!";
    const string value="I'm coming!";
    test t;
    t.set(key,value);
    t.get(key);
}
Run Code Online (Sandbox Code Playgroud)

但是当我把它作为函数留下时

#include <string>
#include <map>
using namespace std;
bool set(const string & key, const string & value, map<string, string> & data)
{
    data[key]=value;
    return …
Run Code Online (Sandbox Code Playgroud)

c++ templates stl map visual-studio-2010

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