当前位置:首页 » 编程语言 » c语言多线程头文件
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言多线程头文件

发布时间: 2023-05-01 15:06:17

㈠ 高手进,关于c语言在windows上建立多线程的问题(VC6.0上实现)

原因 是 在使用CreateThread 会造成一些 资源的无法释放 比如c++对象

当然原因不止这些 还很有几个 详情 你可以参考windows核心编程

㈡ C语言多线程如何实现

线程之间没有共享数据,不需要线程同步
你在主函数里面,把线程销毁的太快了,线程都没来得及执行完你就退出了,在创建完线程之后,加个sleep等待几秒再销毁线程。
同时注意一下,主进程退出的话,所有线程也会退出。

如果要准确的等待线程执行完再销毁,可以使用join方法或者共享标志位的方法

㈢ c语言多线程pthread的问题

运行之前需要做一些配置历好:1.下载PTHREAD的WINDOWS开发包 pthreads-w32-2-4-0-release.exe(任何一个版本均可) http://sourceware.org/pthreads-win32/ ,解压到一个目录。2.找到include和lib文件夹,下面分伍烂搏别把它们添加到VC++6.0的头文件路径和静态链接库路径下面: a).Tools->Options,选择Directory页面,然后在Show directories for:中选择Include files(默认), 在Directories中添加include的路径。在Show directories for:中选择Library files, 在Directories中添加lib的路径。 b).Project->Settings,选腔祥择Link页面,然后将lib下的*.lib文件添加到Object/library Moles, 各lib文件以空格隔开。 c).将lib下的*.dll文件复制到工程目录下,即根目录。 如果不配置环境,将出现以下错误:Linking...
工程名.obj : error LNK2001: unresolved external symbol __imp__pthread_join
工程名.obj : error LNK2001: unresolved external symbol __imp__pthread_create
Debug/工程名.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe. 我自己以前编的一个例子,火车票窗口卖票的 如果不加锁就会出现-2,-1的问题 这里只是个事例 #include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <windows.h>int piao = 100; void* tprocess1(void* args){

while(piao>0){
Sleep(1);
piao--;
printf("窗口1----------------还剩%d张票\n",piao);
// Sleep(5);
}
return NULL;
}
void* tprocess2(void* args){

while(piao>0){
Sleep(1);
printf("窗口2----------------还剩%d张票\n",piao);
// Sleep(9);
}
return NULL;
}
void* tprocess3(void* args){

while(piao>0){
Sleep(1);
piao--;
printf("窗口3----------------还剩%d张票\n",piao);
// Sleep(10);
}
return NULL;
}
void* tprocess4(void* args){

while(piao>0){
Sleep(1);
piao--;
printf("窗口4----------------还剩%d张票\n",piao);
// Sleep(10);
}
return NULL;
}
int main(){
pthread_t t1;
pthread_t t2;
pthread_t t3;
pthread_t t4;
pthread_create(&t1,NULL,tprocess1,NULL);
pthread_create(&t2,NULL,tprocess2,NULL);
pthread_create(&t3,NULL,tprocess3,NULL);
pthread_create(&t4,NULL,tprocess4,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_join(t3,NULL);
pthread_join(t4,NULL);
}

㈣ c语言如何编写一个简单的多线程程序

这是一个多线程例子,里面只有两个线程,是生产者/消费者模式,已编译通毁举宏过,注释很详细,x0dx0a如下:x0dx0ax0dx0a/* 以生答蠢产者和消费者模型问题来阐述Linux线程的控制和通信你 x0dx0a 生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。x0dx0a 缓冲区有N个,是一个环形的缓冲池。x0dx0a */纤册x0dx0a#include x0dx0a#include x0dx0ax0dx0a#define BUFFER_SIZE 16x0dx0ax0dx0astruct prodconsx0dx0a{x0dx0a int buffer[BUFFER_SIZE];/*实际存放数据的数组*/x0dx0a pthread_mutex_t lock;/*互斥体lock,用于对缓冲区的互斥操作*/x0dx0a int readpos,writepos; /*读写指针*/x0dx0a pthread_cond_t notempty;/*缓冲区非空的条件变量*/x0dx0a pthread_cond_t notfull;/*缓冲区未满 的条件变量*/x0dx0a};x0dx0ax0dx0a/*初始化缓冲区*/x0dx0avoid pthread_init( struct prodcons *p)x0dx0a{x0dx0a pthread_mutex_init(&p->lock,NULL);x0dx0a pthread_cond_init(&p->notempty,NULL);x0dx0a pthread_cond_init(&p->notfull,NULL);x0dx0a p->readpos = 0;x0dx0a p->writepos = 0;x0dx0a}x0dx0ax0dx0a/*将产品放入缓冲区,这里是存入一个整数*/x0dx0avoid put(struct prodcons *p,int data)x0dx0a{x0dx0a pthread_mutex_lock(&p->lock);x0dx0a /*等待缓冲区未满*/x0dx0a if((p->writepos +1)%BUFFER_SIZE ==p->readpos)x0dx0a {x0dx0a pthread_cond_wait(&p->notfull,&p->lock);x0dx0a }x0dx0a p->buffer[p->writepos] =data;x0dx0a p->writepos++;x0dx0a if(p->writepos >= BUFFER_SIZE)x0dx0a p->writepos = 0;x0dx0a pthread_cond_signal(&p->notempty);x0dx0a pthread_mutex_unlock(&p->lock);x0dx0a}x0dx0a/*从缓冲区取出整数*/x0dx0aint get(struct prodcons *p)x0dx0a{x0dx0a int data;x0dx0a pthread_mutex_lock(&p->lock);x0dx0a /*等待缓冲区非空*/x0dx0a if(p->writepos == p->readpos)x0dx0a {x0dx0a pthread_cond_wait(&p->notempty ,&p->lock);//非空就设置条件变量notemptyx0dx0a }x0dx0a /*读书据,移动读指针*/x0dx0a data = p->buffer[p->readpos];x0dx0a p->readpos++;x0dx0a if(p->readpos == BUFFER_SIZE)x0dx0a p->readpos = 0;x0dx0a /*设置缓冲区未满的条件变量*/x0dx0a pthread_cond_signal(&p->notfull);x0dx0a pthread_mutex_unlock(&p->lock);x0dx0a return data;x0dx0a}x0dx0a /*测试:生产站线程将1 到1000的整数送入缓冲区,消费者线程从缓冲区中获取整数,两者都打印信息*/x0dx0a#define OVER (-1)x0dx0astruct prodcons buffer;x0dx0avoid *procer(void *data)x0dx0a{x0dx0a int n;x0dx0a for( n=0;n<1000;n++)x0dx0a {x0dx0a printf("%d ------>\n",n);x0dx0a put(&buffer,n);x0dx0a }x0dx0a put(&buffer,OVER);x0dx0a return NULL;x0dx0a}x0dx0avoid *consumer(void *data)x0dx0a{x0dx0a int d;x0dx0a while(1)x0dx0a {x0dx0a d = get(&buffer);x0dx0a if(d == OVER)x0dx0a break;x0dx0a elsex0dx0a printf("----->%d\n",d);x0dx0a }x0dx0a return NULL;x0dx0a}x0dx0aint main()x0dx0a{x0dx0a pthread_t th_p,th_c;x0dx0a void *retval;x0dx0a pthread_init(&buffer);x0dx0a pthread_create(&th_p,NULL,procer,0);x0dx0a pthread_create(&th_c,NULL,consumer,0);x0dx0a /*等待两个线程结束*/x0dx0a pthread_join(th_p, &retval);x0dx0a pthread_join(th_c,&retval);x0dx0a return 0;x0dx0a}

㈤ c语言多线程

因为您传入的是t的地址:rc = pthread_create(&thread[t], NULL, PrintHello, &t);

所以在PrintHello函数中thread_arg = (int)(*((int*)args));读取时会读取到t的最新值,即8.

这是因为主线程一直在执行,for( t = 0; t < NUM_THREADS; t++ )很快执行完,跳出循环t的值为8,而在PrintHello中sleep(1);肯定会读取到t的最新值8.

直接传t的值即可,如下:

#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>//加入这个头文件
#include<pthread.h>
#include<unistd.h>

#defineNUM_THREADS8

void*PrintHello(void*args)
{
intthread_arg;
sleep(1);
thread_arg=(int)(uintptr_t)args;//这样读取传来的t的值
printf("Hellofromthread%d ",thread_arg);
returnNULL;

}

intmain(void)
{
intrc,t;
pthread_tthread[NUM_THREADS];
for(t=0;t<NUM_THREADS;t++)
{
printf("Creatingthread%d ",t);
rc=pthread_create(&thread[t],NULL,PrintHello,(void*)(uintptr_t)t);//这样传t的值
if(rc)
{
printf("ERROR;returncodeis%d ",rc);
returnEXIT_FAILURE;
}
}
sleep(5);
for(t=0;t<NUM_THREADS;t++)
pthread_join(thread[t],NULL);
returnEXIT_SUCCESS;
}

㈥ C语言多线程实现

多线程随机选号程序
以下程友旦序运行后看起来比较有意思,像一个随机选号程序,但不是完全按照问题所说的写的 可供参考,要改很容易

//多线程随渣告穗机选号程序示例
#include <stdio.h>
#include <Windows.h>
#include <ctime>
#include <cstdlib>
#include <process.h>
bool g_run = true; //是否运行

void userInput(void*) //如卜监视输入的线程函数
{
while (true)
{
if (getchar()=='\n') //是否输入回车
{
g_run = !g_run; //回车运行 回车暂停
}
Sleep(10); //延迟
}
}

int main()
{
srand(time(0)); //随机数种子
_beginthread(userInput,0,NULL); //开线程
while (true)
{
if (g_run)
{
system("cls"); //清屏
int t = rand() % 1000+ 1;//1-1000的随机数
printf("\n %d",t); //输出
}
Sleep(50); //延迟50毫秒
}
return 0;
}

㈦ c语言怎么创建线程和使用

进程的生命周期:
[1].创建 --- fork
[2].执行 --- a. exec
b.子进程实现代码逻辑
[3].结束 --- exit _exit
僵尸态进程---wait waitpid
孤儿进程
--------------------------------------
进程存在的问题:
(1).进程的创建 --- 复制
(时间 和 空间的开销很大)
(2).进程的运行 --- 调度-->

㈧ C语言编的程序如何实现多线程运行

unix或linux下可以包含pthread.h头文陵雹告件
使用pthread_create 函数来创建一个尺明线程
int pthread_create (pthread_t *, const pthread_attr_t *,
void *(*)(void *), void *);

windows下也有windows api可以实现肆仔

㈨ C语言PROCESS.H什么意思

process.h 是包含用于和宏指令的作用声明与螺纹和过程一起使用的C标头文件。 标头文件的作用是闷祥由二者之一定义的 ANSI/ISO C 标准或 POSIX、多数C编译器 DOS, 窗口3.1x, Win32, OS/2Novell NetWare或 DOS职能在他们的C程序贺罩物库里。
多线程相关的时候就需要include <process.h>提供了两个对多线程进行支持的函禅液数,即线程的创建和终结没有对线程挂起和恢复进行操作的函数,通常,这两项功能使用win32 api完成。

㈩ C语言可以实现 中断 和 多线程 这类功能吗

“晕,C语言不是灰常强大,无所不能吗?怎么有人说C语言不能实现 中断 和多线程??”这句话要分两部分来说,首先“晕,C语言不是灰常余歼昌强大,无所不能吗?”。没有任何一种语言可以无所不能,原因很简单,任何的语言都脱离不了编译工具,而编译工具脱离不了编译环境。由于编译环境的不同,因此编译工具也有所不同,有得只针对JAVA,有得指针对C++,有得只针对C#。不管C语言多厉害,如果编译工具不支持,那也没有办法在这个编译工具上编译,以至于没有办法在那个编译工具的编译环境中运行。所以不能说无所不能。
“怎么有人说C语言不能实现改激 中断 和多线程啊”,这是一个概念性问题。纯粹的C语言只是一个工具,更多的是一种定义,一种格式,可以抽象成一种风格。就像定义一个整型变量i。为什么你不能用integer i定义,非得int i。例如函数的编写形式,命名规则等等。假如按照C语言的这些规则来编写程序,同时编译工具支持C语言,提供中断库,还有多线程库,那么C语言同样也可以实现中断和多线程。举个例子:例如你手头上只有一个TC编译工具,虽然他支持C语言,但是只能编译16位的DOS程序,碍于这个编译工具的局限性,所以你永远也写不出像Windows操作系统那种带窗口界面的Win32程序,也不能写一个针对.NET框架的网络服务程序。同样的,假如你要开发一个Windows软件,使用VC编译器,而这个编译工具本身带多线程库,同时支持Windows系统的很多调用,所以你完全可以以C语言的风格在这个编译器中调用各种Win32 SDK,开发一个多线程的Windows应用程序。假如你要使用中断,在Windows环境下可以使用微软提供的DDK(驱动开发包),他同样支持C语言,那么你就可以通过这个开发包调用很多中断。在Linux环境下,不需要开发包就可以直接调用,因为Linux自带了很多系统调用都是开放的。头文件声明直接就在Linux文件系统的Sys目录下。所以说他仅仅是一种风格。依赖于编译环境的系统调用同样也依赖于编译环境提供的链接竖扒库。