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

更多文章:


字母f是什么意思?如何将flash变成透明的背景

字母f是什么意思?如何将flash变成透明的背景

本篇文章给大家谈谈f,以及字母f是什么意思对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年10月11日 10:50

turtles歌曲(哪位大神有turtles(乌龟组合)的<谢谢>的歌词中文翻译 感激不尽)

turtles歌曲(哪位大神有turtles(乌龟组合)的<谢谢>的歌词中文翻译 感激不尽)

“turtles歌曲”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看turtles歌曲(哪位大神有turtles(乌龟组合)的的歌词中文翻译 感激不尽)!

2026年10月11日 10:00

java转义字符(java中的转义字符的作用是什么)

java转义字符(java中的转义字符的作用是什么)

其实java转义字符的问题并不复杂,但是又很多的朋友都不太了解java中的转义字符的作用是什么,因此呢,今天小编就来为大家分享java转义字符的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月11日 09:40

金山铁路22号线(请问现在轨道交通22号线金山铁路是个什么情况据说9月28日就开通了啊~~~)

金山铁路22号线(请问现在轨道交通22号线金山铁路是个什么情况据说9月28日就开通了啊~~~)

“金山铁路22号线”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看金山铁路22号线(请问现在轨道交通22号线金山铁路是个什么情况据说9月28日就开通了啊~~~)!

2026年10月11日 09:10

repercussions(都是余波,repercussions和aftermath有什么区别啊)

repercussions(都是余波,repercussions和aftermath有什么区别啊)

今天给各位分享都是余波,repercussions和aftermath有什么区别啊的知识,其中也会对都是余波,repercussions和aftermath有什么区别啊进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月11日 09:00

dropdownlist 绑定(DropDownList 绑定所有项 并 显示指定项)

dropdownlist 绑定(DropDownList 绑定所有项 并 显示指定项)

本篇文章给大家谈谈dropdownlist 绑定,以及DropDownList 绑定所有项 并 显示指定项对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年10月11日 08:50

协方差计算公式(协方差的计算公式)

协方差计算公式(协方差的计算公式)

这篇文章给大家聊聊关于协方差计算公式,以及协方差的计算公式对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年10月11日 08:10

易语言网页api接口怎么调用(易语言,怎么读取网页json的api)

易语言网页api接口怎么调用(易语言,怎么读取网页json的api)

本篇文章给大家谈谈易语言网页api接口怎么调用,以及易语言,怎么读取网页json的api对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年10月11日 08:00

majority of(the majority of 和 a majority of的区别以及用法例句)

majority of(the majority of 和 a majority of的区别以及用法例句)

这篇文章给大家聊聊关于majority of,以及the majority of 和 a majority of的区别以及用法例句对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年10月11日 07:40

汉字机内码查询表(1个汉字的机内码是几位谢谢)

汉字机内码查询表(1个汉字的机内码是几位谢谢)

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

2026年10月11日 07:20

最近更新

热门文章

标签列表