我刚开始学习线程和信号量。 我在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);
}
答案 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);
}
,无论t2
或buf
是先运行。