首先运行线程而不是主要进度

时间:2019-01-22 16:22:00

标签: c multithreading pipe

我正在Win10 x64上使用VS2010开发管道通信工具。
我使用PIPE创建了CreateNamedPipe(L"blablabla",...),它是PIPE - SERVER。然后,我使用PIPE - CLIENT等待ConnectNamedPipe(handle)连接。

由于可以肯定,这里发生的问题无法通过行ConnectNamedPipe(handle)来等待客户端连接。
为了解决这个问题,我刚刚创建了一个等待客户端管道连接的线程。

CreateThread(....)之后,我可以打破障碍,并连接到管道服务器。

这里简单的实现,而不是完整的代码。

DWORD WINAPI _thread_pipe_server_(LPVOID lPvoid)
{
//--------------------------- Step - 01 ---------------------------------
    g_pipe_handle = CreateNamedPipe(g_pipe_name,
        PIPE_ACCESS_DUPLEX,
        PIPE_TYPE_BYTE | PIPE_WAIT,
        PIPE_UNLIMITED_INSTANCES, MAX_PIPE_BUFFER_SIZE, MAX_PIPE_BUFFER_SIZE,
        g_pipe_time, 0);

    if (INVALID_HANDLE_VALUE != g_pipe_handle)
    {
        ConnectNamedPipe(g_pipe_handle, 0);

        // Sending and receiving data...
        // --- >
        // < ---
        DisconnectNamedpipe(g_pipe_handle);
    }

    return ERROR_PROCESS;
}

int main()
{
    HANDLE h_pipe_server = CreateThread(0, 0, _thread_pipe_server_, 0, 0, 0);
    if (INVALID_HANDLE_VALUE != h_pipe_server)
    {
//--------------------------- Step - 02 ---------------------------------
        HANDLE h_pipe_client = CreateFile(g_pipe_name, GENERIC_ALL, 0, 0, OPEN_EXISTING, 0, 0);
        if (INVALID_HANDLE_VALUE != h_pipe_client)
        {
            // Receiving and sending data...
            // < ---
            // --- >
            CloseHandle(h_pipe_client);
        }
    }
}

正如我所说,我正在使用Win10 x64,并且运行良好。 但是在WIN7上Step - 01的处理速度不比Step - 02快。
因此,h_pipe_client不能为有效值,因为Step - 01尚未处理。我怎么总是比Step - 01的父亲Step - 02跑?

1 个答案:

答案 0 :(得分:1)

您可以为此使用信号量。某种伪代码,没有Windows机器可以测试:

DWORD WINAPI _thread_pipe_server_(LPVOID lpSemaphore)
{
    // grab the semaphore from the parameter
    auto pStep1SemaphoreHandle = static_cast<HANDLE*>(lpSemaphore);
//--------------------------- Step - 01 ---------------------------------
    g_pipe_handle = CreateNamedPipe(g_pipe_name,
        PIPE_ACCESS_DUPLEX,
        PIPE_TYPE_BYTE | PIPE_WAIT,
        PIPE_UNLIMITED_INSTANCES, MAX_PIPE_BUFFER_SIZE, MAX_PIPE_BUFFER_SIZE,
        g_pipe_time, 0);
    // after the pipe is created, signal the semaphore so main thread can continue
    ReleaseSemaphore(*pStep1SemaphoreHandle, 1, nullptr);
    if (INVALID_HANDLE_VALUE != g_pipe_handle)
    {
        ConnectNamedPipe(g_pipe_handle, 0);

        // Sending and receiving data...
        // --- >
        // < ---
        DisconnectNamedpipe(g_pipe_handle);
    }

    return ERROR_PROCESS;
}


int main()
{
    // semaphore can tell us when something happened in another thread
    HANDLE step1Semaphore = CreateSemaphore(NULL, 1, 0, NULL);
    HANDLE h_pipe_server = CreateThread(0, 0, _thread_pipe_server_, &step1Semaphore, 0, 0);
    // wait until semaphore was signalled
    WaitForSingleObject(step1Semaphore, INFINITE);
    if (INVALID_HANDLE_VALUE != h_pipe_server)
    {
//--------------------------- Step - 02 ---------------------------------
        HANDLE h_pipe_client = CreateFile(g_pipe_name, GENERIC_ALL, 0, 0, OPEN_EXISTING, 0, 0);
        if (INVALID_HANDLE_VALUE != h_pipe_client)
        {
            // Receiving and sending data...
            // < ---
            // --- >
            CloseHandle(h_pipe_client);
        }
    }
}

无论如何,这就是“一般”解决方案。在这种情况下,您可以在启动另一个线程之前在主线程中 创建句柄...