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、页面的设置完成后,再对该源码进行编译时,就能愉快地看到编译完全成功。
参考技术A1、使用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语言如何实现多线程同时运行的主要内容,如果未能解决你的问题,请参考以下文章