多线程信号量程序

时间:2015-02-09 23:44:49

标签: c multithreading pointers semaphore

我花了几个小时试图弄清楚这一个,我完全陷入困境。该程序应该启动6个线程。一些线程从其他人结束的地方开始。 现在,我试图让一个线程(线程0)执行。大写锁定注释显示我添加了代码并完成了我的错误。我在这里的主要斗争是处理指针。任何人都可以给我任何指针(ha..ha ..:c)?

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define SHARED 1
sem_t sem[6];           

struct threadargs
 {
 int id;        /* thread number */
 int sec;       /* how many sec to sleep */
 int signal[6]; /* which threads to signal when done */
 };                 

void *tfunc(void *arg)
 {
 int i;
 struct threadargs *targs=arg;
 sem_wait(sem);                              //WAIT FOR OWN SEMAPHORE
 printf("Thread %d is running\n", targs->id);
 sleep(targs->sec);
 printf("Thread %d is completed and may wake others..\n", targs->id);
 for(i=0; i<6; i++)                          //ITERATE OVER signal_ARRAY & 
  {                                          //WAKE THREAD NUMBER i IF 
  if(targs->signal[i] == 1)                  //signal[i] IS 1
    pthread_cond_signal(&sem[i]);
  }
 }

int main(void)
 {
 int i, j;
 struct threadargs *targs[6];   
 pthread_t tid[6];
 for(i=0; i<6; i++)
 {
 targs[i] = (struct threadargs*) malloc(sizeof(struct threadargs));
 for(j=0; j<6; j++)
  { targs[i]->signal[j]=0; }   
 }
targs[0]->id=1;         
targs[0]->sec=1;        
targs[0]->signal[1]=1;      
targs[0]->signal[4]=1;
sem[0] = 0;                                 //INITIALIZE THREAD'S SEMAPHORE TO 0 or 1
pthread_create(targs[0], NULL, tfunc, NULL) // START THREAD

for(i=0; i<6; i++)
 pthread_join(tid[i], NULL);
return 0; 
 }

1 个答案:

答案 0 :(得分:1)

好的。首先,我建议您再次查看您的编码风格。它当然是非常主观的,我不会说你的很糟糕,但我花了一段时间来弄明白(如果你真的想知道,我推荐Linux coding style用于C / C ++代码)。< / p>

让我们继续你的问题。据我所知,主要问题似乎是你基本上将苹果指针与香蕉指针进行比较(换句话说,你在错误的位置使用了错误的指针类型)。

要确保对函数等的调用是正确的,请务必查找API文档以查找适合您的新功能(示例:pthread_createsem_init,{{3} },sem_waitsem_post)。

正如您所看到的,pthread_cond_signal不会将sem_t *作为参数,因此您无法将其传递给它并期望它能够正常工作。下面你会找到一个显示如何使用信号量的示例程序。

首先,创建一个新线程,它将立即处于等待状态。一旦主踏板从0到150完成计数,它将发布(“解锁”)信号量并允许第二个线程完成其执行。

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

static sem_t sem_thread_one;
static pthread_t thread_one_data;

static int x;

static void *tfunc(void *arg)
{
    sem_wait(&sem_thread_one);
    printf("Thread 1 is running. The value of x is %i\n", x);
    return NULL;
}

int main(int argc, char **argv)
{
    sem_init(&sem_thread_one, 0 /* don't share between processes */, 0);

    if(pthread_create(&thread_one_data, NULL, &tfunc, NULL)) {
        fprintf(stderr, "Could not create thread, exiting!\n");
        return -EXIT_FAILURE;
    }

    while(x < 150) {
        x++;
    }

    sem_post(&sem_thread_one);

    if(pthread_join(thread_one_data, NULL)) {
        fprintf(stderr, "Could not join threads, exiting!\n");
        return -EXIT_FAILURE;
    }

    sem_destroy(&sem_thread_one);
    printf("Program ran succesfully!\n");
    return -EXIT_SUCCESS;
}

保存在文件sem.c中并编译&amp;链接使用:

gcc -Wall -Os -pthread -o sem_test sem.c

现在是第二个例子,但现在使用pthread_cond_t。该程序的功能有点类似,它等待计数器达到一定数量。

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

static pthread_t thread_one_data, thread_two_data;
static volatile int x, y, idx = 10;
static int count = 1;

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t condition = PTHREAD_COND_INITIALIZER;

static void *cond_test_wait(void *arg)
{
    pthread_mutex_lock(&mutex);
    while(count < 10) {
        printf("Waiting for `count < 10' to become true\n");
        pthread_cond_wait(&condition, &mutex);
    }
    pthread_mutex_unlock(&mutex);

    printf("Test wait thread finished. Value of count: %i\n", count);
    return NULL;
}

static void *cond_test_signal(void *arg)
{
    while(count < 10) {
        pthread_mutex_lock(&mutex);
        pthread_cond_signal(&condition);

        /* do more intelligent things here */
        count++;
        pthread_mutex_unlock(&mutex);
    }

    printf("Test signal thread finished\n");
    return NULL;
}

int main(int argc, char **argv)
{

    if(pthread_create(&thread_one_data, NULL, &cond_test_wait, NULL)) {
        fprintf(stderr, "Could not create thread, exiting!\n");
        return -EXIT_FAILURE;
    }

    if(pthread_create(&thread_two_data, NULL, &cond_test_signal, NULL)) {
        fprintf(stderr, "Could not create thread, exiting!\n");
        return -EXIT_FAILURE;
    }

    pthread_join(thread_one_data, NULL);
    pthread_join(thread_two_data, NULL);

    pthread_cond_destroy(&condition);
    pthread_mutex_destroy(&mutex);

    printf("Program ran succesfully!\n");
    return -EXIT_SUCCESS;
}

保存在cond.c文件中并编译&amp;链接使用:

gcc -o cond -pthread -Os -Wall cond.c

请注意此示例中整洁条件的工作原理。您可以使用它们等待任何表达式(= condition)变为true。条件成立后,正常执行继续。

如果您需要更多帮助,请随时在评论中提问。祝你好运结合上面的例子来修复你的程序。