C语言多线程编程

简介: 原文:C语言多线程编程注:本文内容来源于互联网,感谢作者整理! Windows的多线程编程 c语言 在Windows的多线程编程中,创建线程的函数主要有CreateThread和_beginthread(及_beginthreadex)。
原文: C语言多线程编程

注:本文内容来源于互联网,感谢作者整理!

Windows的多线程编程 c语言

在Windows的多线程编程中,创建线程的函数主要有CreateThread和_beginthread(及_beginthreadex)。
 
CreateThread 和 ExitThread
 
  使用API函数CreateThread创建线程时,其中的线程函数原型:
  DWORD WINAPI ThreadProc(LPVOID lpParameter);
在线程函数返回后,其返回值用作调用ExitThread函数的参数(由系统隐式调用)。可以使用GetExitCodeThread函数获得该线程函数的返回值。
 
  当线程函数的起始地址无效(或者不可访问)时,CreateThread函数仍可能成功返回。如果该起始地址无效,则当线程运行时,异常将发生,线程终止。并返回一个错误代码。
 
  使用CreateThread创建的线程具有THREAD_PRIORITY_NORMAL的线程优先级。可以使用GetThreadPriority和SetThreadPriority函数获取和设置线程优先级值。
 
  系统中的线程对象一直存活到线程结束,并且所有指向它的句柄都通过调用CloseHandle关闭后。
 
_beginthread 和 _endthread (_beginthread & _endthread)
 
  对于使用C运行时库里的函数的线程应该使用_beginthread和_endthread这些C运行时函数来管理线程,而不是使用CreateThread和ExitThread。否则,当调用ExitThread后,可能引发内存泄露。
 
  在使用_beginthread或者_beginthreadex创建线程时,应该包含头文件<process.h>,并且需要设置多线程版 本的运行时库。「Project Settings」--> 「C/C++」-->「Category」-->「Code Generation」-->「Use Run-Time Library」-->「Multithreaded」和「Debug Multithreaded」。这相当于给编译添加了一个编译选项/MT,使编译器在编译时在.obj文件中使用libcmt.lib文件名而不是 libc.lib。连接器使用这个名字与运行时库函数连接。
 
  可以调用_endthread和_endthreadex显示式结束一个线程。然而,当线程函数返回时,_endthread和_endthreadex 被自动调用。endthread和_endthreadex的调用有助于确保分配给线程的资源的合理回收。_endthread自动地关闭线程句柄,然而 _endthreadex却不会。因此,当使用_beginthread和_endthread时,不需要显示调用API函数CloseHandle式关 闭线程句柄。该行为有别于API函数ExitThread的调用。_endthread和_endthreadex回收分配的线程资源后,调用 ExitThread。
 
   当_beginthread和_beginthreadex被调用时,操作系统自己处理线程栈的分配。如果在调用这些函数时,指定栈大小为0,则操作系统 为该线程创建和主线程大小一样的栈。如果任何一个线程调用了abort、exit或者ExitProcess,则所有线程都将被终止。

    线程是操作系统管理的一种资源,不同操作系统差异很大,有的支持,有的不支持,实现的方式也不同,下面是引用的LINUX下多线程例子,使用pthread库,简单说明下:

/*thread_example.c : c multiple thread programming in linux
  *author : falcon
  *date : 2006.8.15
  *e-mail : [email]tunzhj03@st.lzu.edu.cn[/email]
  */
#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
#define MAX 10

pthread_t thread[2]; //创建线程函数返回类型
pthread_mutex_t mut; //互斥锁类型
int number=0, i;

void *thread1() //线程函数
{
  printf ("thread1 : I'm thread 1\n");
   
  for (i = 0; i < MAX; i++)
  {  
  printf("thread1 : number = %d\n",number);  
  pthread_mutex_lock(&mut); //加锁,用于对共享变量操作
  number++;
  pthread_mutex_unlock(&mut); //解锁
  sleep(2);
  }  
   

  printf("thread1 :主函数在等我完成任务吗?\n");
  pthread_exit(NULL);
}

void *thread2()
{
  printf("thread2 : I'm thread 2\n");
   
  for (i = 0; i < MAX; i++)
  {  
  printf("thread2 : number = %d\n",number);
  pthread_mutex_lock(&mut);
  number++;
  pthread_mutex_unlock(&mut);
  sleep(3);
  }  
   

  printf("thread2 :主函数在等我完成任务吗?\n");
  pthread_exit(NULL);
}

void thread_create(void)
{
  /*创建线程*/
  pthread_create(&thread[0], NULL, thread1, NULL);
  printf("线程1被创建\n");
  pthread_create(&thread[1], NULL, thread2, NULL);
  printf("线程2被创建\n");
}

void thread_wait(void)
{
  /*等待线程结束*/
  pthread_join(thread[0],NULL);
  printf("线程1已经结束\n");
  pthread_join(thread[1],NULL);
  printf("线程2已经结束\n");
}

int main()
{
  /*用默认属性初始化互斥锁*/
  pthread_mutex_init(&mut,NULL); 
   
  printf("我是主函数哦,我正在创建线程,呵呵\n");
  thread_create();
  printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");
  thread_wait();
   
  return 0;
}

 

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 Modules,
     各lib文件以空格隔开。
   c).将lib下的*.dll文件复制到工程目录下,即根目录。 

3.代码

1.#include <stdio.h>   
2.#include <stdlib.h>   
3.#include <pthread.h>   
4.#include <windows.h>   
5.  
6.int  piao = 100;   
7.  
8.pthread_mutex_t mut;   
9.    
10.void* tprocess1(void* args){   
11.   int a = 0;   
12.       while(true){   
13.           pthread_mutex_lock(&mut);   
14.           if(piao>0){   
15.            Sleep(1);   
16.            piao--;   
17.            printf("窗口1----------------还剩%d张票\n",piao);   
18.           }else{   
19.            a = 1;   
20.           }   
21.          pthread_mutex_unlock(&mut);   
22.           if(a == 1) {   
23.            break;   
24.           }   
25.        }     
26.           
27.     
28.       return NULL;   
29.}   
30.  
31.void* tprocess2(void* args){   
32.     int a = 0;   
33.       while(true){   
34.           pthread_mutex_lock(&mut);   
35.           if(piao>0){   
36.            Sleep(1);   
37.           piao--;   
38.        printf("窗口2----------------还剩%d张票\n",piao);   
39.           }else{   
40.            a = 1;   
41.           }   
42.          pthread_mutex_unlock(&mut);   
43.           if(a == 1) {   
44.            break;   
45.           }   
46.        }     
47.           
48.     
49.       return NULL;   
50.}   
51.  
52.void* tprocess3(void* args){   
53.   int a = 0;   
54.       while(true){   
55.           pthread_mutex_lock(&mut);   
56.           if(piao>0){   
57.       Sleep(1);   
58.             piao--;   
59.          
60.        printf("窗口3----------------还剩%d张票\n",piao);   
61.           }else{   
62.            a = 1;   
63.           }   
64.          pthread_mutex_unlock(&mut);   
65.           if(a == 1) {   
66.            break;   
67.           }   
68.        }     
69.           
70.     
71.       return NULL;   
72.}   
73.  
74.void* tprocess4(void* args){   
75.       int a = 0;   
76.       while(true){   
77.           pthread_mutex_lock(&mut);   
78.           if(piao>0){   
79.       Sleep(1);   
80.         
81.                   piao--;   
82.          
83.        printf("窗口4----------------还剩%d张票\n",piao);   
84.           }else{   
85.            a = 1;   
86.           }   
87.          pthread_mutex_unlock(&mut);   
88.           if(a == 1) {   
89.            break;   
90.           }   
91.        }     
92.           
93.     
94.       return NULL;   
95.}   
96.  
97.int main(){   
98.  pthread_mutex_init(&mut,NULL);   
99.  pthread_t t1;   
100.  pthread_t t2;   
101.  pthread_t t3;   
102.  pthread_t t4;   
103.  pthread_create(&t4,NULL,tprocess4,NULL);   
104.  pthread_create(&t1,NULL,tprocess1,NULL);   
105.  pthread_create(&t2,NULL,tprocess2,NULL);   
106.  pthread_create(&t3,NULL,tprocess3,NULL);   
107.  Sleep(5000);   
108.  return 0;   
109.}  

 

 

目录
相关文章
|
7天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
21 2
|
12天前
|
Java 调度 开发者
Java中的多线程编程:从基础到实践
本文旨在深入探讨Java多线程编程的核心概念和实际应用,通过浅显易懂的语言解释多线程的基本原理,并结合实例展示如何在Java中创建、控制和管理线程。我们将从简单的线程创建开始,逐步深入到线程同步、通信以及死锁问题的解决方案,最终通过具体的代码示例来加深理解。无论您是Java初学者还是希望提升多线程编程技能的开发者,本文都将为您提供有价值的见解和实用的技巧。
15 2
|
14天前
|
Java 数据处理
Java中的多线程编程:从基础到实践
本文旨在深入探讨Java中的多线程编程,涵盖其基本概念、创建方法、同步机制及实际应用。通过对多线程基础知识的介绍和具体示例的演示,希望帮助读者更好地理解和应用Java多线程编程,提高程序的效率和性能。
19 1
|
17天前
|
安全 Java 调度
Java 并发编程中的线程安全和性能优化
本文将深入探讨Java并发编程中的关键概念,包括线程安全、同步机制以及性能优化。我们将从基础入手,逐步解析高级技术,并通过实例展示如何在实际开发中应用这些知识。阅读完本文后,读者将对如何在多线程环境中编写高效且安全的Java代码有一个全面的了解。
|
7天前
|
Java
COMATE插件实现使用线程池高级并发模型简化多线程编程
本文介绍了COMATE插件的使用,该插件通过线程池实现高级并发模型,简化了多线程编程的过程,并提供了生成结果和代码参考。
|
9天前
|
Java 数据处理 调度
Java中的多线程编程:从基础到实践
本文深入探讨了Java中多线程编程的基本概念、实现方式及其在实际项目中的应用。首先,我们将了解什么是线程以及为何需要多线程编程。接着,文章将详细介绍如何在Java中创建和管理线程,包括继承Thread类、实现Runnable接口以及使用Executor框架等方法。此外,我们还将讨论线程同步和通信的问题,如互斥锁、信号量、条件变量等。最后,通过具体的示例展示了如何在实际项目中有效地利用多线程提高程序的性能和响应能力。
|
10天前
|
安全 算法 Java
Java中的多线程编程:从基础到高级应用
本文深入探讨了Java中的多线程编程,从最基础的概念入手,逐步引导读者了解并掌握多线程开发的核心技术。无论是初学者还是有一定经验的开发者,都能从中获益。通过实例和代码示例,本文详细讲解了线程的创建与管理、同步与锁机制、线程间通信以及高级并发工具等主题。此外,还讨论了多线程编程中常见的问题及其解决方案,帮助读者编写出高效、安全的多线程应用程序。
|
11天前
|
安全 Java 调度
python3多线程实战(python3经典编程案例)
该文章提供了Python3中多线程的应用实例,展示了如何利用Python的threading模块来创建和管理线程,以实现并发执行任务。
12 0
|
12天前
|
存储 缓存 Java
JAVA并发编程系列(11)线程池底层原理架构剖析
本文详细解析了Java线程池的核心参数及其意义,包括核心线程数量(corePoolSize)、最大线程数量(maximumPoolSize)、线程空闲时间(keepAliveTime)、任务存储队列(workQueue)、线程工厂(threadFactory)及拒绝策略(handler)。此外,还介绍了四种常见的线程池:可缓存线程池(newCachedThreadPool)、定时调度线程池(newScheduledThreadPool)、单线程池(newSingleThreadExecutor)及固定长度线程池(newFixedThreadPool)。
|
17天前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
49 0
下一篇
无影云桌面