我花了几个小时试图弄清楚这一个,我完全陷入困境。该程序应该启动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;
}
答案 0 :(得分:1)
好的。首先,我建议您再次查看您的编码风格。它当然是非常主观的,我不会说你的很糟糕,但我花了一段时间来弄明白(如果你真的想知道,我推荐Linux coding style用于C / C ++代码)。< / p>
让我们继续你的问题。据我所知,主要问题似乎是你基本上将苹果指针与香蕉指针进行比较(换句话说,你在错误的位置使用了错误的指针类型)。
要确保对函数等的调用是正确的,请务必查找API文档以查找适合您的新功能(示例:pthread_create,sem_init,{{3} },sem_wait,sem_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。条件成立后,正常执行继续。
如果您需要更多帮助,请随时在评论中提问。祝你好运结合上面的例子来修复你的程序。