您的位置:

c语言线程间通信方法,c线程间通信的几种方法

本文目录一览:

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

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;

}

线程之间的通信例子 求一个WINDOWS下多线程间通信的例子,用C语言编写!

#include

stdio.h

int

main(int

argc,

char

**argv){

CreateThread(NULL,

0,

thread2,

this,

0,

0);

printf("主线程正在执行!\n");

return

0;

}

void

thread2(){

sleep(2);//睡2毫秒

printf("第二个线程在运行!\n");

}

这个例子可能很简单,但能说明问题了。

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

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

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

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

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

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

qt 与c程序怎么通信

共享内存、管道都是可以的。但其实现在一般来说,没有特殊的理由的话,socket是进程间通信的首选。c部分添加发送数据的模块,qt用一个线程来,收到数据就触发一个signal, 界面(主线程)的一个slot接受这个signal并更新显示。

c语言实例,linux线程同步的信号量方式 谢谢

这么高的悬赏,实例放后面。信号量(sem),如同进程一样,线程也可以通过信号量来实现通信,虽然是轻量级的。信号量函数的名字都以"sem_"打头。线程使用的基本信号量函数有四个。

     信号量初始化。

     int sem_init (sem_t *sem , int pshared, unsigned int value);

    这是对由sem指定的信号量进行初始化,设置好它的共享选项(linux 只支持为0,即表示它是当前进程的局部信号量),然后给它一个初始值VALUE。

    等待信号量。给信号量减1,然后等待直到信号量的值大于0。

    int sem_wait(sem_t *sem);

    释放信号量。信号量值加1。并通知其他等待线程。

    int sem_post(sem_t *sem);

    销毁信号量。我们用完信号量后都它进行清理。归还占有的一切资源。

    int sem_destroy(sem_t *sem);

#include stdlib.h  

    #include stdio.h  

    #include unistd.h  

    #include pthread.h  

    #include semaphore.h  

    #include errno.h  

    #define return_if_fail(p) if((p) == 0){printf ("[%s]:func error!/n", __func__);return;}  

    typedef struct _PrivInfo  

    {  

        sem_t s1;  

        sem_t s2;  

        time_t end_time;  

    }PrivInfo;  

    static void info_init (PrivInfo* thiz);  

    static void info_destroy (PrivInfo* thiz);  

    static void* pthread_func_1 (PrivInfo* thiz);  

    static void* pthread_func_2 (PrivInfo* thiz);  

    int main (int argc, char** argv)  

    {  

        pthread_t pt_1 = 0;  

        pthread_t pt_2 = 0;  

        int ret = 0;  

        PrivInfo* thiz = NULL;  

        thiz = (PrivInfo* )malloc (sizeof (PrivInfo));  

        if (thiz == NULL)  

        {  

            printf ("[%s]: Failed to malloc priv./n");  

            return -1;  

        }  

        info_init (thiz);  

        ret = pthread_create (pt_1, NULL, (void*)pthread_func_1, thiz);  

        if (ret != 0)  

        {  

            perror ("pthread_1_create:");  

        }  

        ret = pthread_create (pt_2, NULL, (void*)pthread_func_2, thiz);  

        if (ret != 0)  

        {  

            perror ("pthread_2_create:");  

        }  

        pthread_join (pt_1, NULL);  

        pthread_join (pt_2, NULL);  

        info_destroy (thiz);  

        return 0;  

    }  

    static void info_init (PrivInfo* thiz)  

    {  

        return_if_fail (thiz != NULL);  

        thiz-end_time = time(NULL) + 10;  

        sem_init (thiz-s1, 0, 1);  

        sem_init (thiz-s2, 0, 0);  

        return;  

    }  

    static void info_destroy (PrivInfo* thiz)  

    {  

        return_if_fail (thiz != NULL);  

        sem_destroy (thiz-s1);  

        sem_destroy (thiz-s2);  

        free (thiz);  

        thiz = NULL;  

        return;  

    }  

    static void* pthread_func_1 (PrivInfo* thiz)  

    {  

        return_if_fail(thiz != NULL);  

        while (time(NULL)  thiz-end_time)  

        {  

            sem_wait (thiz-s2);  

            printf ("pthread1: pthread1 get the lock./n");  

            sem_post (thiz-s1);  

            printf ("pthread1: pthread1 unlock/n");  

            sleep (1);  

        }  

        return;  

    }  

    static void* pthread_func_2 (PrivInfo* thiz)  

    {  

        return_if_fail (thiz != NULL);  

        while (time (NULL)  thiz-end_time)  

        {  

            sem_wait (thiz-s1);  

            printf ("pthread2: pthread2 get the unlock./n");  

            sem_post (thiz-s2);  

            printf ("pthread2: pthread2 unlock./n");  

            sleep (1);  

        }  

        return;  

    }