我们可以使用新的条件变量原语或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
来自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
我即将更新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++
当我尝试在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)