C多线程控制与信号量

时间:2014-08-18 20:00:41

标签: c multithreading

我试图了解线程和信号量。

我希望编写一个包含4个线程的代码,它输出一个类似" foo dee"的字符串,但我希望线程1仅键入" f",2只键入& #34; o",线程3仅键入" e"和" d"和第四个线程只能键入空格。

我如何将线程链接起来,以便得到一个" foo dee"在屏幕上,这是他们所有人的共同工作。

我不想要一个解决方案,但我可以使用的语法示例。

感谢您的帮助。

编辑:在linux上工作

2 个答案:

答案 0 :(得分:0)

您可以在此处找到如何创建信号量结构和创建线程:for Windows  和for Linux

你需要做的是:在主线程中创建4个线程,然后控制它们。

提示:在windows中WaitForMultipleObjects函数使当前线程等待。 ReleaseSemaphore函数释放信号量,让其他线程进入临界区..

示例代码:

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

pthread_t tid[2]; sem_t mutex;

void* doSomeThing(void *arg) {
    unsigned long i = 0;
    pthread_t id = pthread_self();

    sem_wait(&mutex);         // Lock Entrance

    if(pthread_equal(id,tid[0]))
    {
        printf("\n First thread processing\n");
    }
    else
    {
        printf("\n Second thread processing\n");
    }

    for(i=0; i<(0xFFFFFFFF);i++);

    sem_post(&mutex);         // Lock Exit

    return NULL; }

int main(void) {
    int i = 0;
    int err;        if( sem_init(&mutex,1,1) < 0)
    {
      perror("semaphore initilization");
      exit(0);
    }

    while(i < 2)
    {
        err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
        if (err != 0)
            printf("\ncan't create thread :[%s]", strerror(err));
        else
            printf("\n Thread created successfully\n");

        i++;
    }

    sleep(5);
    return 0; }

增加线程计数器以获得更多线程..

答案 1 :(得分:0)

尝试强制线程按顺序操作,就像这样打破了创建线程的目的。所有其他线程必须等待预定义的行为发生。为了实现这个目标,你必须以一种与顺序操作没有太大区别的方式来阻塞线程(然后在此基础上添加线程创建和管理的开销)

...但如果你真的想这样做,我会使用信号代替信号量。信号量和互斥量通常用于控制对共享资源的并发访问。通过强制执行顺序,确实没有共享资源可供使用。

信号背后的想法是,一个线程将等到另一个线程将其启动。看看以下功能:

pthread_cond_wait()
pthread_cond_signal()

我认为他们是获得你想要的最佳方式。