信号量不能正常工作?

时间:2015-05-26 18:11:31

标签: pthreads semaphore

我刚开始学习线程和信号量。 我在C中创建了一个简单的程序,但它没有按预期工作。 请查看代码并告诉我哪里错了?

提前致谢。

我使用的是Ubuntu 14.04。

我正在使用的命令

gcc -o foo th.c -lpthread

./ FOO

th.c是我的c文件的名称

每次程序输出时执行:

线程1

线程2

你好线程!

但我大部分时间都在接受

线程2

线程1

代码:

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

void myFun1(void *ptr);
void myFun2(void *ptr);

char buf[24];
sem_t mutex;

int main(){

    pthread_t t1;
    pthread_t t2;

    char *msg1 = "Thread 1";
    char *msg2 = "Thread 2";

    sem_init(&mutex, 0, 1);

    printf("mutex 00 %d \n", mutex);    
    pthread_create(&t1, NULL, (void *) &myFun1, (void *) msg1);
    pthread_create(&t2, NULL, (void *) &myFun2, (void *) msg2);

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    sem_destroy(&mutex);

    return 0;
}

void myFun1 (void *ptr) {

    char *msg = (char *)ptr;
    printf("%s\n", msg);

    sem_wait(&mutex);
    sprintf(buf, "%s", "Hello Threads!");
    sem_post(&mutex);

    pthread_exit(0);
}

void myFun2(void *ptr) {

    char *msg = (char *)ptr;
    printf("%s\n", msg);

    sem_wait(&mutex);
    printf("%s\n", buf);
    sem_post(&mutex);

    pthread_exit(0);
}

1 个答案:

答案 0 :(得分:1)

你的期望是错误的。您的程序不包含任何同步以使<?php $db = new mysqli("localhost","username","password","database"); // Insert record into database using prepared statement... // Works fine. // Retrieve recently installed data... $EnteredDataStmt = $db->prepare("SELECT * FROM correspondence where id = ?") $EnteredDataStmt->bind_param('i', $LatestInsertID) // Get ID number of latest inserted data... $LatestInsertID = $db->insert_id; $EnteredDataStmt->execute() // I want to check that only 1 result is returned... $EnteredDataStmt->store_result() $NumResults = $EnteredDataStmt->num_rows; if($NumResults == 1) { $EnteredDataResult = $EnteredDataStmt->get_result(); while ($row = $EnteredDataResult->fetch_array(MYSQLI_ASSOC)) // <- Error indicates problem at this line { foreach ($row as $key => $value) { print "<p>$key: $value</p>"; } print "\n"; } } $EnteredDataStmt->close(); unset($EnteredDataResult); $db->close() ?> 线程在Fatal error: Call to a member function fetch_array() on a non-object... 线程之前执行(反之亦然),因此可以进行排序。

t1首先获取信号量的情况下,t2仍然是一个空字符串,这将是打印的内容。

您需要t2等待buf填充缓冲区。您可以通过将信号量初始化为0来完成此操作,并且仅在写入t2之后发布信号量。在t1

buf

main()

sem_init(&mutex, 0, 0);

myFun1

void myFun1 (void *ptr) {

    char *msg = (char *)ptr;
    printf("%s\n", msg);

    sprintf(buf, "%s", "Hello Threads!");
    sem_post(&mutex);

    pthread_exit(0);
}

现在myFun2只会在初​​始化后尝试打印void myFun2(void *ptr) { char *msg = (char *)ptr; printf("%s\n", msg); sem_wait(&mutex); printf("%s\n", buf); pthread_exit(0); } ,无论t2buf是先运行。

相关问题