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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言如何实现多线程同时运行相关的知识,希望对你有一定的参考价值。

我这里有个两函数
int i=0;
void fun()

Sleep(1000);

printf("%d\n",i);


还有一个
void sound()

Beep(2000,8000);//响8秒


我想要每1秒输出一个数,但是执行到Beep函数就会阻塞8秒
求多线程方法解决这个问题

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

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

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

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

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

参考技术A

1、使用pthread库执行多线程,这个是Linux下的线程库 Windows下应该有自己的API,不过这种东西一般还是以Linux为标准。pthread_create()创建一个线程,传入fun()的函数指针就行了。


2、例程:

#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
#include <string.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)

int temp;
memset(&thread, 0, sizeof(thread)); //comment1
/*创建线程*/
if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2
printf("线程1创建失败!\\n");
else
printf("线程1被创建\\n");
if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3
printf("线程2创建失败");
else
printf("线程2被创建\\n");

void thread_wait(void)

/*等待线程结束*/
if(thread[0] !=0)  //comment4
pthread_join(thread[0],NULL);
printf("线程1已经结束\\n");

if(thread[1] !=0)  //comment5
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;

参考技术B c11自带多线程库<threads.h>,旧版本的c则要调用对应的系统api或第三方库 参考技术C 使用pthread库执行多线程,这个是Linux下的线程库 Windows下应该有自己的API,不过这种东西一般还是以Linux为标准。pthread_create()创建一个线程,传入fun()的函数指针就行了。
然后这个Beep()的需求要进行线程间通信,可以用共享内存的方法,设一个bool变量flag共享,然后beep的时候设为false,beep完设成true。fun()里面每次看一下这个flag,是false的话就不做动作等下一秒,基本可以满足需求。
这样做的好处是实现简单,但时间是以1s为单位的。如果要8秒结束立刻执行,需要用条件变量的方法来控制,比较复杂,这样的实现方式一个可以满足需求了。本回答被提问者和网友采纳

用C语言如何实现多线程同时运行的情况下,各个线程输出不同的随机数?

我用系统时间作为种子,发现因为各个线程之间运行的时间差太小,所以产生的随机数还是相同的。网上有种方法可以用微秒级的时间作种子,但我没看懂,不知道谁能帮忙解释下不?或者有其他方法也欢迎提出。不过在srand前让线程sleep的方法就不需要了,因为我这里的情况要求线程之间要同时运行。

1、使用pthread库执行多线程,这个是Linux下的线程库 Windows下应该有自己的API,不过这种东西一般还是以Linux为标准。pthread_create()创建一个线程,传入fun()的函数指针就行了。然后这个Beep()的需求要进行线程间通信,可以用共享内存的方法,设一个bool变量flag共享,然后beep的时候设为false,beep完设成true。fun()里面每次看一下这个flag,是false的话就不做动作等下一秒,基本可以满足需求。

2、例程:

#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
#include <string.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)

int temp;
memset(&thread, 0, sizeof(thread)); //comment1
/*创建线程*/
if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2
printf("线程1创建失败!\\n");
else
printf("线程1被创建\\n");
if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3
printf("线程2创建失败");
else
printf("线程2被创建\\n");

void thread_wait(void)

/*等待线程结束*/
if(thread[0] !=0)  //comment4
pthread_join(thread[0],NULL);
printf("线程1已经结束\\n");

if(thread[1] !=0)  //comment5
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;

参考技术A 你用 (系统时间 - 线程 id*10) 作种子 就可以了。
种子变了,随机数系列就会变。
或 一个线程种子用 srand(1234); 另一个用 srand(4321); ...
加 系统时间 目的是 每次跑程序 随机数系列不同,更符合“随机”。本回答被提问者采纳

以上是关于C语言如何实现多线程同时运行的主要内容,如果未能解决你的问题,请参考以下文章

用C语言开多线程,想让多个相同的子线程同时运行,怎么实现

c# 多线程运行时出现主界面卡死现象如何解决?

C语言如何终止线程

C语言如何终止线程?

c语言实现多线程

如何实现javascript多线程同时运行?