c 多线程(c语言实现多线程)

:暂无数据 2026-07-31 00:50:02 :0

c  多线程(c语言实现多线程)

其实c 多线程的问题并不复杂,但是又很多的朋友都不太了解c语言实现多线程,因此呢,今天小编就来为大家分享c 多线程的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

本文目录

c语言实现多线程

目录:

  1. Linux操作系统,C语言实现多线程

  2. Windows操作系统,C语言实现多线程

  3. Windows下的多线程(不带停止)

Linux操作系统,C语言实现多线程:

#include 《stdio.h》
#include 《stdlib.h》
#include 《pthread.h》
void * ThreadOne ( void * threadArg )
{
    printf ( “线程开始啦,参数是:%s\n“ , (char *)threadArg );
    return NULL;
}
int main ( void )
{
    pthread_t ThreadID;   /* 记录线程标识符 */
    void * waitingResult;  /* 等待线程退出的等待结果 */
    int errorCode;         /* 记录线程的错误代码 */
    char * aMessage = “这是线程的参数“ ;
    /* 创建并启动线程ThreadOne。若返回值非零,则线程创建失败 */
    errorCode = pthread_create( &ThreadID, NULL, ThreadOne, aMessage );
    if ( errorCode != 0 )
    {
        printf (“线程ThreadOne创建失败。错误代码:%d\n“, errorCode );
        return EXIT_FAILURE ;
    }
    /* 等待线程标识符为的ThreadID的线程结束 */
    errorCode = pthread_join( ThreadID, &waitingResult );
    if ( errorCode != 0 )
    {
        printf ( “等待线程退出等待失败。错误代码:%d\n“ , errorCode ) ;
        return EXIT_FAILURE ;
    }
    printf( “线程的返回值是%p\n“, waitingResult );
    return EXIT_SUCCESS ;
}

Windows操作系统,C语言实现多线程:

#include 《stdio.h》
#include 《windows.h》
DWORD APIENTRY ThreadOne ( LPVOID threadArg )
{
    printf ( “线程开始啦,参数是:%s\n“ , (char *)threadArg );
    return 0;
}
int main ( void )
{
    HANDLE hThread;  /* 记录线程句柄 */
    DWORD ThreadID;  /* 记录线程ID号 */
    DWORD waitingResult;  /* 等待线程退出的等待结果 */
    DWORD threadExitCode;  /* 记录线程的返回值 */
    char * aMessage = “这是线程的参数“ ;
    /* 创建并启动线程ThreadOne,返回值为线程句柄,赋值给hThread */
    hThread = CreateThread ( NULL, 0L, ThreadOne, (LPVOID)aMessage, 0L, &ThreadID );
    if ( hThread == NULL )
    {
        printf (“线程ThreadOne创建失败。错误代码:%lu\n“, GetLastError() );
        return EXIT_FAILURE ;
    }
    /* 等待线程句柄为的hThread线程结束 */
    waitingResult = WaitForSingleObject ( hThread, INFINITE );
    if ( waitingResult == WAIT_FAILED )
    {
        printf ( “等待线程退出等待失败。错误代码:%lu\n“ , GetLastError() ) ;
        return EXIT_FAILURE ;
    }
    if ( GetExitCodeThread ( hThread , &threadExitCode ) )
        printf ( “线程的返回值是%lu\n“, threadExitCode ) ;
    else
        printf ( “获取线程的返回值获取失败。错误代码:%lu\n“ , GetLastError() ) ;
    return EXIT_SUCCESS ;
}

Windows下的多线程:(不带停止)

#include 《stdio.h》
#include 《windows.h》
DWORD WINAPI duoxianchen(LPVOID lpParam);
int main(int argc, char *argv)
{
int num=0;
CreateThread(NULL,NULL,duoxianchen,&num,NULL, NULL);
while(1)
{
num++; 
printf(“主线程! %05d\n“,nu***eep(40);
}
return 0;
}
DWORD WINAPI duoxianchen(LPVOID lpParam)
{
int* a=lpParam;
while(1) 
{
++*a; 
printf(“副线程! %05d 0x%p\n“,*a,a); 
Sleep(80);
}
return 0;
}

C语言能实现多线程么

可以通过调用C语言函数库pthread里的函数,创建多线程。

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

C语言最初并未设计多线程的机制,随着软硬件的发展及需求的发展,C语言才开发了线程库以支持多线程的操作和应用。

C语言如何实现多线程同时运行

1、点击菜单栏的“Project”选项卡,下拉列表的最后一项“Project options...”是对当前工程的的属性进行设置的。

2、选择弹出对话框中的“Compiler”选项卡。

3、将其中的“Runtime Library”的选择改为“Multithreaded (LIB)”。

4、将看到对话框最下面的文本框中发生了一些变化,新增了“-MT”选项,这与编译器一开始所报的错误提示给出的解决方案一致。

5、页面的设置完成后,再对该源码进行编译时,就能愉快地看到编译完全成功。

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

这是一个多线程例子,里面只有两个线程,是生产者/消费者模式,已编译通过,注释很详细,
如下:

/* 以生产者和消费者模型问题来阐述Linux线程的控制和通信你
生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。
缓冲区有N个,是一个环形的缓冲池。
*/
#include 《stdio.h》
#include 《pthread.h》

#define BUFFER_SIZE 16

struct prodcons
{
int buffer[BUFFER_SIZE];/*实际存放数据的数组*/
pthread_mutex_t lock;/*互斥体lock,用于对缓冲区的互斥操作*/
int readpos,writepos; /*读写指针*/
pthread_cond_t notempty;/*缓冲区非空的条件变量*/
pthread_cond_t notfull;/*缓冲区未满 的条件变量*/
};

/*初始化缓冲区*/
void pthread_init( struct prodcons *p)
{
pthread_mutex_init(&p-》lock,NULL);
pthread_cond_init(&p-》notempty,NULL);
pthread_cond_init(&p-》notfull,NULL);
p-》readpos = 0;
p-》writepos = 0;
}

/*将产品放入缓冲区,这里是存入一个整数*/
void put(struct prodcons *p,int data)
{
pthread_mutex_lock(&p-》lock);
/*等待缓冲区未满*/
if((p-》writepos +1)%BUFFER_SIZE ==p-》readpos)
{
pthread_cond_wait(&p-》notfull,&p-》lock);
}
p-》buffer[p-》writepos] =data;
p-》writepos++;
if(p-》writepos 》= BUFFER_SIZE)
p-》writepos = 0;
pthread_cond_signal(&p-》notempty);
pthread_mutex_unlock(&p-》lock);
}
/*从缓冲区取出整数*/
int get(struct prodcons *p)
{
int data;
pthread_mutex_lock(&p-》lock);
/*等待缓冲区非空*/
if(p-》writepos == p-》readpos)
{
pthread_cond_wait(&p-》notempty ,&p-》lock);//非空就设置条件变量notempty
}
/*读书据,移动读指针*/
data = p-》buffer[p-》readpos];
p-》readpos++;
if(p-》readpos == BUFFER_SIZE)
p-》readpos = 0;
/*设置缓冲区未满的条件变量*/
pthread_cond_signal(&p-》notfull);
pthread_mutex_unlock(&p-》lock);
return data;
}
/*测试:生产站线程将1 到1000的整数送入缓冲区,消费者线程从缓冲区中获取整数,两者都打印信息*/
#define OVER (-1)
struct prodcons buffer;
void *producer(void *data)
{
int n;
for( n=0;n《1000;n++)
{
printf(“%d ------》\n“,n);
put(&buffer,n);
}
put(&buffer,OVER);
return NULL;
}
void *consumer(void *data)
{
int d;
while(1)
{
d = get(&buffer);
if(d == OVER)
break;
else
printf(“-----》%d\n“,d);
}
return NULL;
}
int main()
{
pthread_t th_p,th_c;
void *retval;
pthread_init(&buffer);
pthread_create(&th_p,NULL,producer,0);
pthread_create(&th_c,NULL,consumer,0);
/*等待两个线程结束*/
pthread_join(th_p, &retval);
pthread_join(th_c,&retval);
return 0;
}

C语言多线程的优势

线程程序作为一种多任务、并发的工作方式,当然有其存在优势:
提高应用程序响应:
这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。
使多CPU系统更加有效:
操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
改善程序结构:
一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

C语言怎样实现多线程

首先你要有控制蛇移动方向的全局变量(定义在main以外因为线程函数也要调用它,每次键盘输入都会修改它的值), 比如 char direction ’a’ ==左 ’w’ == 右 ’d’==上 ’s’ == 下,然后你在移动时应该是在while里面操作的吧,你每移动一步前都读一下direction这个变量的数值然后再控制移动方向(注意s这个键可以忽略因为不会倒着走) 然后你可以用pthread.h这个库 例子是 pthread t;// 定义一个线程 pthread_create(&t, null, listen_keyboard_input, null);//建立线程执行listen_keyboard_input这个函数 这个线程执行的函数 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ direction =getchar(); } } 但是这里存在同步问题, 比如当这个线程的getchar()在给direction辅助的同时,你控制贪吃蛇移动的线程正在调用 direction的值来判断下一个移动方向,这就会出问题,所以要加一个锁,叫 mutex lock;这个也定义成全局变量可以使各线程共享。 pthread_mutex_t mutex; //定义一个锁 pthread_mutex_init(&mutex, null, null);//初始化 然后把函数修改成 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ pthread_mutex_lock(&mutex); direction =getchar(); pthread_mutex_unlock(&mutex); } } 另外一个控制贪吃蛇移动的时候也要加锁 while(.....){ char c; pthread_mutex_lock(&mutex); c = direction; pthread_mutex_unlock(&mutex); switch(c){ ................ } ................................... } 这样就好了 注意你的控制贪吃蛇移动的部分也必须要放在另外一个pthread 里面执行,如果放在主线程, 主线程会一直等listen_keyboard_input而什么事都不会做 你把这两个线程用 pthread_create 创建完成后 用 t1.join(); t2.join(); 就可以使这两个线程并发执行了 如果你用的是linux 来编译的,你再输入gcc 指令后加上 -lpthread 就可以了 还有什么不懂的你可以多找找 pthread 类的例子

c的多线程实现

#include 《stdio.h》
#include 《pthread.h》
void thread(void)
{
int i;
for(i=0;i《3;i++)
printf(“This is a pthread.\n“);
}

int main(void)
{
pthread_t id;
int i,ret;
ret=pthread_create(&id,NULL,(void *) thread,NULL);
if(ret!=0){
printf (“Create pthread error!\n“);
exit (1);
}
for(i=0;i《3;i++)
printf(“This is the main process.\n“);
pthread_join(id,NULL);
return (0);
}

不算是双核优化哈!也不是并发处理,如果真的让多线程发挥到极致就用多核经较好

c语言多线程问题

#include 《stdio.h》
#include 《process.h》
#include 《windows.h》

long g_nNum; //全局资源
unsigned int __stdcall Fun(void *pPM); //线程函数
const int THREAD_NUM = 10; //子线程个数

int main()
{
g_nNum = 0;
HANDLE handle[THREAD_NUM];

int i = 0;
while (i 《 THREAD_NUM)
{
handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL);
i++;//等子线程接收到参数时主线程可能改变了这个i的值
}
//保证子线程已全部运行结束
WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);
return 0;
}

unsigned int __stdcall Fun(void *pPM)
{
//由于创建线程是要一定的开销的,所以新线程并不能第一时间执行到这来
int nThreadNum = *(int *)pPM; //子线程获取参数
Sleep(75);//some work should to do
g_nNum++; //处理全局资源
Sleep(1);//some work should to do
printf(“线程编号为%d 全局资源值为%d\n“, nThreadNum, g_nNum);
getch();
return 0;
}

关于c 多线程和c语言实现多线程的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

c  多线程(c语言实现多线程)

本文编辑:admin

更多文章:


issued retroactively(FORM E上盖“ISSUED RETROACTIVELY”的问题,小女在线等待)

issued retroactively(FORM E上盖“ISSUED RETROACTIVELY”的问题,小女在线等待)

各位老铁们,大家好,今天由我来为大家分享issued retroactively,以及FORM E上盖“ISSUED RETROACTIVELY”的问题,小女在线等待的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站

2026年10月15日 10:30

f发音是什么?printf的返回值是什么

f发音是什么?printf的返回值是什么

大家好,关于f很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于f发音是什么的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

2026年10月15日 10:10

begin和start的区别(start与begin的区别)

begin和start的区别(start与begin的区别)

其实begin和start的区别的问题并不复杂,但是又很多的朋友都不太了解start与begin的区别,因此呢,今天小编就来为大家分享begin和start的区别的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月15日 09:20

vant官网中文(范特365 是韩国化妆品VANT36.5吗)

vant官网中文(范特365 是韩国化妆品VANT36.5吗)

大家好,今天小编来为大家解答以下的问题,关于vant官网中文,范特365 是韩国化妆品VANT36.5吗这个很多人还不知道,现在让我们一起来看看吧!

2026年10月15日 09:10

特殊字符是指什么?正则表达式中一些特殊字符的用法

特殊字符是指什么?正则表达式中一些特殊字符的用法

大家好,特殊字符相信很多的网友都不是很明白,包括特殊字符是指什么也是一样,不过没有关系,接下来就来为大家分享关于特殊字符和特殊字符是指什么的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

2026年10月15日 08:10

特殊符号网名大全花样符号(特殊符号昵称有哪些)

特殊符号网名大全花样符号(特殊符号昵称有哪些)

本篇文章给大家谈谈特殊符号网名大全花样符号,以及特殊符号昵称有哪些对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年10月15日 07:30

prison break(越狱(prison break)到底是在讲个什么)

prison break(越狱(prison break)到底是在讲个什么)

各位老铁们好,相信很多人对prison break都不是特别的了解,因此呢,今天就来为大家分享下关于prison break以及越狱(prison break)到底是在讲个什么的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看

2026年10月15日 06:50

c程序设计第五版教学视频(求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!)

c程序设计第五版教学视频(求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!)

各位老铁们,大家好,今天由我来为大家分享c程序设计第五版教学视频,以及求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动

2026年10月15日 06:40

电脑教程入门(电脑初学入门)

电脑教程入门(电脑初学入门)

本篇文章给大家谈谈电脑教程入门,以及电脑初学入门对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年10月15日 06:20

十六进制转二进制表(16进制转为2进制、8进制、10进制的公式)

十六进制转二进制表(16进制转为2进制、8进制、10进制的公式)

“十六进制转二进制表”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看十六进制转二进制表(16进制转为2进制、8进制、10进制的公式)!

2026年10月15日 06:10

最近更新

issued retroactively(FORM E上盖“ISSUED RETROACTIVELY”的问题,小女在线等待)
2026-10-15 10:30:03 浏览:0
如何制作短视频(短视频怎么制作)
2026-10-15 10:20:11 浏览:0
f发音是什么?printf的返回值是什么
2026-10-15 10:10:03 浏览:0
免费网站做seo(个人网站如何做SEO)
2026-10-15 09:30:11 浏览:0
热门文章

标签列表