C,,多线程详解

嗨,大伙儿好!小编要和大家来聊一聊C语言中的多线程!

首先,让我们来简单地了解一下什么是多线程。简而言之,多线程就是同时处理多个任务的技术。相比于单线程,多线程能够同时运行多个不同的任务,并且提高了程序的效率和性能。

在C语言中,我们可以使用POSIX线程库(又称pthread库)来实现多线程。pthread库提供了一系列的API函数,可以用来创建线程、控制线程的运行、进行线程间的通信等等。

下面,让我们来看看几个重要的pthread函数:

1. pthread_create()函数:用来创建新的线程。它的原型如下:

```c

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

void *(*start_routine) (void *), void *arg);

```

其中,thread参数是用来存储新线程的ID;attr参数是用来指定新线程的属性,如它的栈大小;start_routine参数是新线程要执行的函数;arg参数是传递给线程的参数。

举个例子,下面是一个简单的pthread_create()函数的使用示例:

```c

#include

#include

void *thread_func(void *arg) {

printf("Hello, from another thread!\n");

return NULL;

}

int main() {

pthread_t tid;

int ret;

ret = pthread_create(&tid, NULL, thread_func, NULL);

if (ret != 0) {

printf("Error creating thread\n");

return 1;

}

printf("Main thread is done!\n");

return 0;

}

```

这个程序会创建一个新线程,并在新线程中打印一条消息。它也会在主线程中打印一条‘Main thread is done!’的消息。

2. pthread_join()函数:用来等待一个线程结束。它的原型如下:

```c

int pthread_join(pthread_t thread, void **retval);

```

这个函数会使当前线程一直等待,直到被指定的线程(即thread参数)结束执行。retval参数是一个指针,用来存储被等待线程的返回值。

举个例子,下面是一个简单的pthread_join()函数的使用示例:

```c

#include

#include

void *thread_func(void *arg) {

int i;

for (i = 0; i < 5; i++) {

printf("Hello, from another thread! %d\n", i);

}

return NULL;

}

int main() {

pthread_t tid;

int ret;

int i;

ret = pthread_create(&tid, NULL, thread_func, NULL);

if (ret != 0) {

printf("Error creating thread\n");

return 1;

}

for (i = 0; i < 3; i++) {

printf("Hello, from main thread! %d\n", i);

}

ret = pthread_join(tid, NULL);

if (ret != 0) {

printf("Error joining thread\n");

return 1;

}

printf("Main thread is done!\n");

return 0;

}

```

这个程序会创建一个新线程和主线程。新线程会打印一条消息5次,而主线程会打印一条消息3次。然后,主线程会等待新线程结束后再退出。

3. pthread_mutex_lock()和pthread_mutex_unlock()函数:用来实现线程之间的互斥。它们的原型如下:

```c

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

```

这些函数需要使用一个pthread_mutex_t类型的变量来指定需要保证互斥的代码段。当某个线程尝试使用pthread_mutex_lock()函数来获取这个变量时,如果变量已经被其他线程占用了,它就会一直等待,直到变量被释放。使用pthread_mutex_unlock()函数释放变量时也需要保证线程安全。

举个例子,下面是一个简单的线程安全的计数器程序:

```c

#include

#include

pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;

int counter = 0;

void *thread_func(void *arg) {

int i;

for (i = 0; i < 100000; i++) {

pthread_mutex_lock(&counter_mutex);

counter++;

pthread_mutex_unlock(&counter_mutex);

}

return NULL;

}

int main() {

pthread_t tids[2];

int ret;

int i;

for (i = 0; i < 2; i++) {

ret = pthread_create(&tids[i], NULL, thread_func, NULL);

if (ret != 0) {

printf("Error creating thread %d\n", i);

return 1;

}

}

for (i = 0; i < 2; i++) {

ret = pthread_join(tids[i], NULL);

if (ret != 0) {

printf("Error joining thread %d\n", i);

return 1;

}

}

printf("Counter: %d\n", counter);

return 0;

}

```

这个程序创建了两个新线程,并让它们不停地将计数器值加1。由于计数器是一个共享变量,我们需要用pthread_mutex_lock()/pthread_mutex_unlock()来保证线程之间的互斥。最后,主线程打印出计数器的值。

好了,今天的多线程介绍就到这里。如果你想了解更多关于多线程的知识,还需继续深入学习哦。 www.0574web.net 宁波海美seo网络优化公司 是网页设计制作,网站优化,企业关键词排名,网络营销知识和开发爱好者的一站式目的地,提供丰富的信息、资源和工具来帮助用户创建令人惊叹的实用网站。 该平台致力于提供实用、相关和最新的内容,这使其成为初学者和经验丰富的专业人士的宝贵资源。

点赞(60) 打赏

声明本文内容来自网络,若涉及侵权,请联系我们删除! 投稿需知:请以word形式发送至邮箱18067275213@163.com

评论列表 共有 4 条评论

seo前景不好看 4月前 回复TA

这才是真正的seo精神 向站长老师致敬

Long Tong 7月前 回复TA

我们的网站一直排在一个仅有注册页面的网站下面很纠结这是为什么呢?而且外链和收录都不及我们。

le 8月前 回复TA

sorry 在您前面的文章中我看到您说.edu跟.gov是可信的域名.怎么这里.gov变成了.org,请问您这篇文章的确是要表在达.org也是可信域名吗?

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部