我不知道如何在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;
}
答案 0 :(得分:4)
这是一个简单的winapi线程指南
http://www.cs.rpi.edu/academics/courses/netprog/WindowsThreads.html
话虽这么说,C是一种简约语言,没有像java这样的内置线程(也没有庞大的额外库)。它是作为一种通用语言建立在它之上。在类Unix系统上,有超出ANSI / ISO标准的系统范围标准c库,它们是posix标准的一部分,pthreads是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 ++中。
答案 1 :(得分:3)
标签建议您使用Windows。 Win32 api有一个CreateThread函数,可用于启动新线程。但是,当您使用C运行时(您是)时,您应该通过包含process.h
来使用_beginthread函数。
使用_beginthread
的原因是它初始化C运行时在线程内正确执行所需的特定于线程的状态信息。
答案 2 :(得分:3)
如果您熟悉pthread和/或想要跨平台代码库,则可以使用MinGW和pthreads-win32。我最近在我的应用程序中使用它,它似乎工作得很好。如果您是专门为Windows开发的,那么可能值得您花时间学习WinracI线程的内容,正如redcomet建议的那样。
答案 3 :(得分:2)
C标准库没有线程概念。线程通常是OS中的概念。你可以使用win32api来处理线程,就像你在linux中使用pthread一样(实际上并不是那么平等......)
要了解有关win32api的更多信息,请访问MSDN。
如何使用win32api创建线程:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682516(v=vs.85).aspx
答案 4 :(得分:0)
这是用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;
}