【问题标题】:How can i create a multithread in C for windows?如何在 C 中为 windows 创建多线程?
【发布时间】:2012-01-16 19:41:09
【问题描述】:

我不知道如何在 C 中创建线程,我看到了关于 pthread.h 库的评论,但后来我听说它仅适用于 Linux 操作系统,我有一个计时器功能,我想用它创建一个线程该函数,但我不知道我需要使用的库和编写代码的语法,如果有人可以为我提供一个带线程的简单代码,或者告诉我我需要放置什么以及函数的参数。

这是我创建的倒计时用户应用的特定时间的功能: 我需要用那个函数创建一个线程。

功能(倒计时):

#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

void countdown(int second)
{
    int secs = 1;
    time_t unix;
    struct tm * timeinfo;
    time(&unix);
    timeinfo = localtime(&unix);
    int t1 = timeinfo->tm_sec;
    int t2 = timeinfo->tm_sec;
    int i = 0;

    while(1 == 1)
    {
       time(&unix);
       timeinfo = localtime(&unix);
       if((t1 + i)  == timeinfo->tm_sec)
       {
              system("cls");
              printf("Time left %d\n", timeinfo->tm_sec - t2 - second);
              i++;
       }
       if(timeinfo->tm_sec >= (t1 + second))
       {
           system("cls");
           puts("Your time its done");
           break;
       }

    }
}

int main()
{
    int limit;
    printf("How much time would you like (In secs): ");
    scanf("%d", &limit);
    countdown(limit);

    system("PAUSE");
    return 0;
}

【问题讨论】:

  • 嗨。您可以使用 win32 api 中的 CreateThread

标签: c multithreading winapi timer


【解决方案1】:

这是一个用 C 语言编写的 Win32API 的单线程和多线程示例程序。

SingleThread_Win.c

#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#include<Windows.h>

void countdown(int second)
{
    int secs = 1;
    time_t unix;
    .....
    .....
}

DWORD WINAPI funThread(void *x)
{
    int c = (int*)x;
    countdown(c);
    return 0;
}

int main()
{
    int limit;
    printf("How much time would you like (In secs): ");
    scanf("%d", &limit);

    HANDLE  myhandle;
    DWORD threadId;
    myhandle = CreateThread(NULL, 0, funThread, (void *)limit, 0, &threadId);
    if (myhandle == NULL)
    {
        printf("Create Thread Failed. Error no: %d\n", GetLastError);
    }
    WaitForSingleObject(myhandle, INFINITE);
    CloseHandle(myhandle);

    system("PAUSE");
    return 0;
}

MultiThreading_Win.c

#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define NUM_THREADS 5    // Define number of threads here or take as user input
#include<Windows.h>

void countdown(int second)
{
    int secs = 1;
    time_t unix;
    .....
    .....
}

DWORD WINAPI funThread(void *x)
{
    int c = (int*)x;
    countdown(c);
    return 0;
}

int main()
{
   int limit;
   printf("How much time would you like (In secs): ");
   scanf("%d", &limit);
   //scanf("%d", &NUM_THREADS);    //Take number of threads as Input 

   HANDLE *arrayThread;
   arrayThread = (int*)malloc(NUM_THREADS * sizeof(int));
   DWORD ThreadId;

   for (int i = 0; i < NUM_THREADS; i++)
   {
       arrayThread[i] = CreateThread(NULL, 0, funThread, (void *)limit, 0, &ThreadId);
       if (arrayThread[i] == NULL)
       {
           printf("Create Thread %d get failed. Error no: %d", i, GetLastError);
       }
   }

  WaitForMultipleObjects(NUM_THREADS, arrayThread,TRUE,INFINITE);
  DWORD lpExitCode;
  BOOL result;

  for (int i = 0; i < NUM_THREADS; i++)
  {
    CloseHandle(arrayThread[i]);
  }

  system("PAUSE");
  return 0;
}

【讨论】:

    【解决方案2】:

    标签表明您使用的是 Windows。 Win32 api 有一个CreateThread 函数,可以用来启动一个新线程。但是,当您使用 C 运行时(您是)时,您应该通过包含 process.h 来使用 _beginthread 函数。

    使用_beginthread 的原因是它初始化了C 运行时需要在线程中正确执行的线程特定状态信息。

    【讨论】:

      【解决方案3】:

      C 标准库没有线程概念。线程通常是操作系统中的一个概念。您可以使用 win32api 来处理线程,就像您在 linux 中使用 pthread 一样(实际上并不那么相等..)

      要了解更多关于win32api的信息,请访问MSDN。

      如何用win32api创建线程:

      http://msdn.microsoft.com/en-us/library/windows/desktop/ms682516(v=vs.85).aspx

      【讨论】:

        【解决方案4】:

        这里是winapi线程的简单指南
        http://www.cs.rpi.edu/academics/courses/netprog/WindowsThreads.html

        话虽如此,C 是一种极简语言,没有像 java 那样的内置线程(也没有庞大的额外库)。它是作为一种通用语言建立在它之上的。在类 Unix 系统上,有超出 ANSI/ISO 标准的系统范围的标准 c 库,它们是 posix 标准的一部分,pthread 是 posix-threads。 Windows C 库是 MS 以自己的方式做事。您可以使用提供多操作系统支持的框架,例如 glib 或 qt(Windows、Linux、其他 *nix)。还有一些端口和兼容性层可以在 Windows 中使用 posix 工具。除了库之外,Cigwin 为您提供了一个完整的 posix 环境,MinGW 编译器允许您在 win32 层之上使用 posix 函数的端口。

        glib 和 qt 之类的框架最好让您的代码保持多平台,它们隐藏了操作系统的细节,允许使用更通用的方法。

        glib 是用于 GUI 开发的 GTK 库的一部分,QT 也是一个 GUI 开发框架,但使用 C++。

        【讨论】:

        • 您的链接已损坏。
        【解决方案5】:

        如果您熟悉 pthread 和/或想要跨平台代码库,您可以使用 MinGW 和 pthreads-win32。我最近在我的一个应用程序中使用了它,它似乎工作得很好。如果您是专门为 Windows 开发的,那么按照 redcomet 的建议,您可能值得花时间学习 WinAPI 线程。

        【讨论】:

          猜你喜欢
          • 2023-03-15
          • 1970-01-01
          • 2021-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-26
          相关资源
          最近更新 更多