在C语言中使用多线程

码农公社  210.net.cn   210是何含义?10月24日是程序员节,1024 = 210、210既 210 之意。


1、C语言多线程需要使用头文件pthread.h 


2、使用pthread_t来创建线程id,使用pthread_create创建线程。线程创建完会进行执行。、 pthread_create函数有四个参数, 

第一个参数是指向线程标识符的指针,也就是指向线程id。 

第二个参数用来设置线程属性,一般为NULL。 

第三个参数是线程运行函数的起始地址,也就是该线程需要启动的函数。 

第四个参数是运行函数的参数,进行传参,一般可设置为NULL。


3、线程创建完毕后有返回值,返回值为0即为创建成功,否则创建失败。 

4、pthread_exit函数是用来终止线程的。线程的退出有显式退出和隐式退出,pthread_exit函数用来进行显式退出。


pthread_exit函数有一个参数,是函数的返回代码。 

5、SuspendThread函数在windows环境下是暂停线程的执行 参数是该线程的id 

6、ResumeThread函数在windows环境下是继续执行线程 参数是该线程的id 

7、pthread_join函数,这个函数用来等待一个线程的结束,以阻塞的方式等待thread指定的线程结束,如果不结束会一直等待。


参数有两个,第一个参数填写标识符,即是线程的iD,第二个参数是用户自定义的指针,用来存储被等待线程的返回值,可以为NULL。 

函数返回值为int型,返回0表示成功,返回其他值即为失败。


8、在多线程中常常会出现线程间共享的数据在使用的时候出现数据不一致问题,比如A和B两个线程同时使用共享数据t,

如果一个进行加操作,一个进行减操作,最后的结果可能会出现错误的情况。怎么避免这种情况呢,这就需要使用到锁的机制了。

当一个线程访问一个数据时对这个数据进行上锁,当操作完成后再进行解锁。在上锁的时候别的线程想要访问这个数据会无法访问,只有解锁后才可以进行访问。那么就不会造成数据共享出现的错误行为了。

在C里面我们使用pthread_mutex_t来定义一个互斥变量,然后通过pthread_mutex_init来进行初始化操作。

pthread_mutex_init函数有两个变量,第一个变量是pthread_mutex_t *类型的,我们可以写入互斥变量的地址,第二个变量是const pthread_mutexattr_t *类型的,

我们常使用NULL来写入。

例如:在一个C程序中我们定义一个全局变量pthread_mutex_t m 来作为互斥变量,在主函数中进行初始化操作:pthread_mutex_init(&m, NULL);这样互斥锁就创建完成,可以在线程中进行使用。

在多个线程中使用全局变量的时候,先使用pthread_mutex_lock来进行加锁操作,然后去对这个变量进行操作,操作完成后使用pthread_mutex_unlock进行解锁,这样其他的线程也可以对这个变量进行其他操作了。

例如:有一个全局变量num = 0;我在线程A中对num进行自加一次操作,在线程B中也进行自加一次操作,那么我可以这样写:

pthread_mutex_lock(&);

num++;

pthread_mutex_unlock(&m);

这样就会避免自加重复,值不准确的问题了。


评论